2010-07-21 5 views
1

헤더의 다른 클래스 인 정적 멤버로 클래스를 선언 할 때 문제가 있습니까? 예 :정적 클래스 멤버로 선언 된 C++ 클래스

class Stat 
{ 
public: 
    int avar; 
    Stat(); 
}; 

class Test 
{ 
public: 
    static Stat stat; 
}; 

문제가 발생할 수있는 이유는 헤더에 전역 변수를 선언하는 것과 매우 유사하게 보입니다. 두 개의 cpp 파일에 포함 된 경우 두 파일에서 global이 선언되어 오류가 발생합니다.

위의 예제에서 'stat'는 여전히 전역과 동일한 두 개의 cpp 파일간에 한 번만 만들어야합니다. 따라서 컴파일러는 한 상황을 처리 할 수 ​​있지만 다른 상황은 처리하지 못하거나 대답 할 수 없습니까?

Stat Test::stat; 

그래서 어떤 컴파일러 나 링커 오류가 없습니다 :

+1

이들은 __CLASS 정의입니다, declarations__ 없습니다. 'Test :: stat', howver는 __member 선언 __ 일 뿐이며 여전히 정의가 필요합니다. ([이 답변] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632)에 대한 선언과 정의는 무엇입니까? C++.) – sbi

답변

4

대답은 당신이 선언 할 수처럼 당신이 (정적을 선언하는 것입니다 글로벌). 그러나 cpp 파일에서만 정의해야합니다. .H에서

:

extern int myGlobal; 
class A 
{ 
    static int myStaticMember; 
}; 

통화 당에서 :

int myGlobal = 42; 
int A::myStaticMember = 42; 
+0

나는 당신이'A :: myStaticMember'을 의미한다고 생각한다. – Gianluca

+0

고마워, 편집. – Scharron

4

에만 클래스 자체의 정적 클래스 멤버 변수를 선언하는, 당신은 별도의 cpp 파일에을 정의 에 있습니다. 헤더의 선언은 단순히 cpp 파일의 정의를 참조합니다.

전역 변수 측면에서

, 선언은 동일합니다 :

extern int global; 

그리고 정의하는 것과 같습니다

int global;