* .cpp 파일에서 정적 클래스 멤버 함수를 구현하는 방법은 무엇입니까?


125

static헤더 파일에서 수행하는 대신 * .cpp 파일에서 클래스 멤버 함수 를 구현할 수 있습니까?

모든 static기능은 항상 inline있습니까?


4
cpp 파일에서 정적 클래스 구성원 함수를 구현할 수없는 이유를 설명해 주시겠습니까? 오류가 있습니까? 일반적으로 이러한 기능을 구현하는 위치에 대한 제한은 없습니다.
winterTTr 2011 년

7
@winterTTr, 웹의 대부분의 예제 / 튜토리얼이 별도의 구현 예제를 제공하지 않고 대신 헤더에서 선언하고 정의하기 때문에 질문이 생겼을 것입니다. "C ++ 정적 멤버 함수"에 대해 제가 가장 좋아하는 검색 엔진의 처음 6 개 적중은 모두 이러한 방식으로 수행되며 초보자를 위해 별도의 파일로 구현하는 방법을 설명하지 않습니다.
crobar

7
구현할 때 static키워드를 반복하지 마십시오 . 쓰기 static전용 헤더 파일에서 클래스 정의에 키워드를
SomethingSomething

@crobar, 다중 파일 예제가 부족하다는 것이 맞습니다. : 나는 다음과 공유하기로 결정 그래서 나는이 밖으로을 파악하기 위해 노력
돈 맥라클란

답변:


153

그것은.

test.hpp :

class A {
public:
    static int a(int i);
};

test.cpp :

#include <iostream>
#include "test.hpp"


int A::a(int i) {
    return i + 2;
}

using namespace std;
int main() {
    cout << A::a(4) << endl;
}

항상 인라인은 아니지만 컴파일러가 만들 수 있습니다.


47

이 시도:

header.hxx :

class CFoo
{
public: 
    static bool IsThisThingOn();
};

class.cxx :

#include "header.hxx"
bool CFoo::IsThisThingOn() // note: no static keyword here
{
    return true;
}

9

helper.hxx

class helper
{
 public: 
   static void fn1 () 
   { /* defined in header itself */ }

   /* fn2 defined in src file helper.cxx */
   static void fn2(); 
};

helper.cxx

#include "helper.hxx"
void helper::fn2()
{
  /* fn2 defined in helper.cxx */
  /* do something */
}

A.cxx

#include "helper.hxx"
A::foo() {
  helper::fn1(); 
  helper::fn2();
}

C ++에서 정적 함수를 처리하는 방법에 대한 자세한 내용은 다음을 참조하십시오. C ++의 정적 멤버 함수가 여러 번역 단위로 복사됩니까?


2

예, * .cpp 파일에서 정적 멤버 함수를 정의 할 수 있습니다. 헤더에서 정의하면 컴파일러는 기본적으로 인라인으로 처리합니다. 그러나 정적 멤버 함수의 별도 복사본이 실행 파일에 존재한다는 의미는 아닙니다. 이에 대해 자세히 알아 보려면이 게시물을 따르십시오. C ++의 정적 멤버 함수가 여러 번역 단위로 복사됩니까?


클래스 본문에서 정의하면 자동으로 기본값이됩니다. 이 클래스 본문 외부 헤더에 있다면, 하나는 더 나은 표시했다 inline거나 template또는 링커에서 여러 정의 오류를 얻을 수 있습니다.
Ben Voigt 2011 년

2

헤더 파일에서 foo.h 라고 말하십시오 .

class Foo{
    public:
        static void someFunction(params..);
    // other stuff
}

구현 파일에서 foo.cpp 라고 말하십시오.

#include "foo.h"

void Foo::someFunction(params..){
    // Implementation of someFunction
}

매우 중요

구현 파일에서 정적 함수를 구현할 때 메서드 서명에 static 키워드를 사용하지 않는지 확인하십시오.

행운을 빕니다


1

@crobar, 당신은 다중 파일 예제가 부족하다는 것을 알고 있으므로 다른 사람들에게 도움이되기를 희망하면서 다음을 공유하기로 결정했습니다.

::::::::::::::
main.cpp
::::::::::::::

#include <iostream>

#include "UseSomething.h"
#include "Something.h"

int main()
{
    UseSomething y;
    std::cout << y.getValue() << '\n';
}

::::::::::::::
Something.h
::::::::::::::

#ifndef SOMETHING_H_
#define SOMETHING_H_

class Something
{
private:
    static int s_value;
public:
    static int getValue() { return s_value; } // static member function
};
#endif

::::::::::::::
Something.cpp
::::::::::::::

#include "Something.h"

int Something::s_value = 1; // initializer

::::::::::::::
UseSomething.h
::::::::::::::

#ifndef USESOMETHING_H_
#define USESOMETHING_H_

class UseSomething
{
public:
    int getValue();
};

#endif

::::::::::::::
UseSomething.cpp
::::::::::::::

#include "UseSomething.h"
#include "Something.h"

int UseSomething::getValue()
{
    return(Something::getValue());
}


0

#include지시문은 문자 그대로 "해당 파일의 모든 데이터를이 지점으로 복사"를 의미합니다. 따라서 헤더 파일을 포함하면 코드 파일 내에 텍스트가 있고 그 안에있는 모든 것이 코드 파일 (현재 컴파일 단위 또는 번역 단위 라고 함 )이 전 처리기 모듈에서 컴파일러 모듈로 전달됩니다.

이는 정적 멤버 함수의 선언과 정의가 실제로 동일한 파일에 있음을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.