2012-12-04 6 views
1

처음에는 프로그래머가 아니라는 것을 알려야합니다. 숙제를 위해이 작업을 수행하고 있으므로 가능한 경우 정말 자세한 설명이 필요합니다 :)C++의 정적 생성자 및 치명적인 오류 LNK1120 : 해결되지 않은 외부 요소 1 개

저는 현재 포인트 좌표를 저장하는 데 사용하는 Node 클래스가 있습니다. 게다가, 내가하고 싶은 것은 각각의 다른 Node 객체에 카운터를 기반으로하는 인덱스 번호를 할당하는 것입니다. 내가 인터넷에서 수집 한 방법은 생성자에서 내 카운터를 초기화하는 다른 클래스를 사용하는 것이고 Node 클래스에서는 정적 매개 변수로 추가하는 것입니다.

이 위의 내 코드입니다 : 이제

class counter 
{ 
    public: 
    int nr; 
    counter() 
    { 
     nr = 0; 
    } 
}; 

class Nod 
{ 
    static counter ctr; 

    public: 
    int index;  
    Punct pct; 
    Nod(Punct &temp) 
    { 
     pct = temp;  
     index = ctr.nr ++ ; 
    } 
    Nod() {} 
}; 

확인을 기반으로하지만, 곧 내가 내 주요 함수 내에서 고개를 끄덕 객체를 선언하려고 나는 다음과 같은 오류 얻을 : 치명적인 오류 LNK1120를 : 1 개의 미해결 된 외부와 나는 이것이 왜 있는지 전혀 모른다. 이전에 내 자신의 소멸자를 작성하려고 할 때이 오류가 발생 했었지만 그 코드를 삭제하면 해결할 수 있습니다.

내가 언급 한 일부 항목에 대해 잘못된 용어를 사용하고있어 죄송합니다.

+2

전체 오류 메시지를 포함하는 질문을 수정하세요. –

답변

0

문제는 Nod::ctr선언하지만 정의 된 것입니다.

class Nod 
{ 
    // Declare the counter variable 
    static counter ctr; 

    ... 
}; 

// Define the counter variable 
counter Nod::ctr; 

정의 물론 소스 파일에 있어야하지 헤더 파일, 또는 대신 여러 정의 오류를 얻을 것이다.

2

정적 데이터 멤버는 클래스 선언 이지만 정확히 하나 개의 변환 단위 (= .cpp 파일)에 정의이어야한다. 하나 개의 .cpp 파일 (바람직 Nod.cpp)에 다음을 넣어 : BTW

counter Nod::ctr; 

, 당신은 단지 int 대신 사용자 정의 클래스 counter 사용될 수 있었다.

+0

그는이 예제에서 오류를 재생산하는 작은 코드를 게시하기 위해 코드를 상당히 줄였습니다.이 코드는 오류를 재현합니다. – CashCow

+0

@CashCow True. 그러나이 질문에 대한 설명에서 나는 "첫 번째 구글 히트를 복사 & 붙이기"와 같은 인상을 받았다. – Angew

0

문제에 대한 설명에서 해결책이 훨씬 간단합니다.

당신은 생성자의 1 개 이상의 유형이있는 경우,

class Nod 
{ 
static int ctr; 

public: 
int index;  
    Nod() 
{ 
    ctr++; //Increment the counter every time a object is created 
} 
Nod() {} 
}; 


//Allocate memory also 

int Nod::ctr; 

를 사용할 때마다 생성자에서 카운터 증분을 추가, 간단한 문제를 복잡하게했다.

2

나는 그것도 범하다. 그런 다음 Scott Meyers의 기사를 읽었습니다. 그는 클래스 정적 변수가 아닌 정적 함수를 권장했습니다. 즉, 변수를 한 곳에서 선언하고 정의 할 수 있습니다. 다음 지문 : 귀하의 경우

0 1 2 3 4 5 6 7 8 9

#include <iostream> 

int next_index(void) 
{ 
    static int index = 0; 
    return index++; 
} 

int main(void) 
{ 
    for (int i = 0; i < 10; ++i) { 
    std::cout << next_index() << ' '; 
    } 
} 

다음을 넣어 것 :

Nod(Punct &temp) 
{ 
    pct = temp;  
    index = next_index(); 
} 
+0

감사합니다. 그 해결책은 제가 찾고 있던 것이 었습니다. 많은 감사 : D 조 – user1876125