2012-04-22 2 views
1

클래스 이름이 GTAODV 인 정적 멤버 배열을 만들었습니다.C++의 정적 멤버 배열

gtaodv/gtaodv.o: In function `GTAODV::command(int, char const* const*)': 
gtaodv.cc:(.text+0xbe): undefined reference to `GTAODV::numdetections' 
gtaodv.cc:(.text+0xcc): undefined reference to `GTAODV::numdetections' 
gtaodv/gtaodv.o: In function `GTAODV::check_malicious(GTAODV_Neighbor*)': 
gtaodv.cc:(.text+0x326c): undefined reference to `GTAODV::numdetections' 
gtaodv.cc:(.text+0x3276): undefined reference to `GTAODV::numdetections' 
collect2: ld returned 1 exit status 

왜이 작업을 수행 : 나는, 클래스 방법 (아래 예) 내에서

numdetections[nb->nb_addr]++; 
for(int i=0; i<MAXNODES; i++) if (numdetections[i] != 0) printf("Number of detections of %d = %d\n", i, numdetections[i]); 

를이 배열에 액세스 할 때

static int numdetections[MAXNODES]; 

그러나, 링커는 컴파일시 에러를 제공합니다 우연히 있다?

+3

링커가'numdetections'의 정의를 알지 못하기 때문에. 이 변수를 어디에서 사용하고 있습니까? 정의는 어디에 있습니까? –

+0

GTAODV 클래스에서 numdetection을 정의했으며 GTOADV 멤버 함수에서 사용하고 있습니다. – vigs1990

+0

코드를 게시하십시오 ... –

답변

10

이 오류가 발생하면 정적 멤버를 정의하는 것을 잊어 버릴 가능성이 높습니다. 클래스 정의 내에서이 가정 :

class GTAODV { 
public: 
    static int numdetections[MAXNODES]; // static member deklaration 
    [...] 
}; 

을 A A 소스 파일 내에서 :

int GTAODV::numdetections[] = {0}; // static member definition 

참고 클래스 선언 외부의 정의.

편집이 질문은 "이유"에 대한 대답입니다. 정적 멤버는 구체적인 개체가 없어도 존재할 수 있습니다. 이자형. 개체를 GTAODV으로 인스턴스화하지 않고 numdetections을 사용할 수 있습니다. 이 외부 연결을 가능하게하려면 참조 용으로 정적 변수의 정의가 존재해야합니다 (Static data members (C++ only)).

+1

해당 정의를 cpp 파일에 두어 정의가 한 번만 정의되도록해야합니다. – zmccord

+0

예, 이것이 오류의 원인입니다. 왜 이런 일이 일어 났는지 설명해 주시겠습니까? - 메모리가 선언 될 때 정적 멤버 배열에 할당되어 있다고 생각했습니다. 이 방법으로 정적 멤버 값을 초기화하지만 정적 멤버 배열을 초기화하는 방법을 알지 못했습니다. – vigs1990

+0

@zmccord 힌트를 보내 주셔서 감사합니다. –