2010-05-19 4 views
4
#include<stdio.h> 

class A { public: int a;}; 
class B: public A { 
public: 
    static int b; 
    B(){ 
     b++; 
     printf("B:%d\n",b); 
    } 
}; 

int main() { 

    A* a1 = new B[100]; 
    A* a2 = new B(); 
    return 0; 
} 

오류 :이 코드의 문제점은 무엇입니까?

In function `main': 
undefined reference to `B::b' 
undefined reference to `B::b' 
undefined reference to `B::b' 
undefined reference to `B::b' 
+3

0이 질문 일주일에 약 10 번 참조 : D – Simon

+0

@ 사이먼 : 그래서? 그 질문에 대한 링크를 게시 할 수 있습니까? 나는 한 번 봐보고 아마도 배울 것입니다. – Lazer

답변

16

정적 변수는 클래스 외부에 할당 될 필요가있다. 클래스 B 외부에서이 줄을 추가 : 정적 변수의

int B::b; 

생각해을 extern 키워드로 선언되고있다. 그들은 여전히 ​​어딘가에 할당해야합니다. 이는 할당이 절대로 헤더 파일에 없어야 함을 의미합니다!

+0

실제로, 할당 파일은 프로그램에서 (링크 오류를 방지하기 위해) 한 곳에서 사용되는 경우 헤더 파일에있을 수 있습니다. 나 맞아? – Lazer

+0

@Lazer : 실제로, 그러나 그것은 두 개 이상의 파일에 포함될 헤더 파일의 목적을 무효화합니다. – PierreBdR

+0

네가 맞다는 것을 알았는지, 내가 그걸 제대로 이해했는지 확인하고 싶었다. 감사! – Lazer

3

정적이기 때문에 B::b에 대한 저장소를 정의해야합니다 (클래스 정의에서 변수 선언이 모두 끝났습니다).

당신은 추가해야합니다

당신은 INT처럼 따라 .cpp 파일에 정적 멤버를 초기화해야
int B::b; 
+0

나는 동의하지 않는다. B :: b는 정적인지 아닌지에 상관없이 아무런 가치가 없다. – adhanlon

+0

@ Silmaril- 응? –

+4

@ Silmaril89 : "가치가 없습니까?" 그게 무슨 뜻이야? C++에서 정적 저장 기간을 가진 객체는 항상 0으로 초기화됩니다. 이 경우'B :: b'는 프로그램이 시작될 때 0이됩니다. – AnT

0

B : B =

+1

정적 저장 기간이 '0'인 개체는 초기화 할 필요가 없습니다. 어떤 경우에도 자동으로 0으로 초기화됩니다. OP의 경우에서 누락 된 것은 객체의 * 정의 *입니다. 명시 적으로 초기화되는지 여부는 즉시 중요하지 않습니다. – AnT

+0

확인해 주셔서 감사합니다. – InsertNickHere

+0

아마도 초기화하지 않고도 빠져 나올 수는 있지만 해를 끼치 지 않고 코드가 명확 해집니다. –

관련 문제