2013-04-24 4 views
0

저는 C++을 처음 사용하고 정적 키워드의 다양한 용도를 배우려고합니다. 그 중 하나는 정적 변수를 정의하는 것입니다. 범위 연산자를 사용하여 호출하십시오. 나는 그것을 사용하려고했지만 Visual Studio 2012에서는 연결 오류가 발생합니다.C++ 정적 변수로 치명적인 오류가 발생합니다. LNK1120 : Visual Studio에서 1 개의 확인되지 않은 외부 참조

class Vehicle 
{ 
public: 
    Vehicle(){}; 
    ~Vehicle(){}; 
    static int temp; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    Vehicle::temp=100; 

    std::cout << Vehicle::temp << std::endl; 

    system("Pause"); 
    return 0; 
} 

그리고 오류는 다음과 같습니다 : 내 코드는

1> LearningC++ OBJ :. 오류 LNK2001 : 확인되지 않은 외부 기호 "공공 정적 INT 차량 : 온도?"(임시 @ 차량 @@ 2HA)

1> C : \ 사용자 \ 아브람 \ 비주얼 스튜디오 2012 \ 문서 \ 프로젝트 \ LearningC++ \ 디버그 \ LearningC++ EXE :. 치명적인 오류 LNK1120 : 1 개 확인되지 않은 외부

무엇을 CAUS 수 이 문제가 있습니까?

EDIT1 (좀 더 명확하게하기 위해) :

내 질문은 내가 클래스 내에 선언 된 정적 변수에 액세스 할 수있는 방법인가? 멤버 함수를 사용하지 않고 이것이 가능합니까?

+1

변수를 정의해야합니다. 클래스 정의 다음에'int Vehicle :: temp;'를 추가하십시오. – jrok

답변

2

당신은 temp을 정의 할 필요가 class Vechicle 후이 추가 :

class Vehicle 
{ 
// Left out class code for brevity 
    void useTemp() { temp = 200 ; } // Adding method inside class the uses temp 
}; 

int Vehicle::temp = 0 ; 

참고, 당신은 temp을 정의 할 때 static 키워드가 필요하지 않습니다. 이 때문에 static 당신은 변수에 액세스하는 클래스의 인스턴스를 필요로하지 않기 때문에 당신이 main에 있던 코드가 정확한지 :

Vehicle::temp=100; 

std::cout << Vehicle::temp << std::endl; 

Vehicle v1 ; 
v1.useTemp() ; 

std::cout << Vehicle::temp << std::endl; 
+0

@AvraamMavridis 클래스의 내부와 외부에서 'temp'를 사용하는 방법을 알기 쉽게 설명하는 몇 가지 세부 정보를 추가했습니다. –

0

을 당신은 클래스 외부 static 멤버를 정의해야

#include <iostream> 

class Vehicle 
{ 
    public: 
    Vehicle(){}; 
    ~Vehicle(){}; 
    static int temp; 
}; 

int Vehicle::temp = 0; 

int _tmain(int argc, TCHAR* argv[]) 
{ 
    Vehicle::temp = 100; //^^access the variable with classname plus :: 
    std::cout << Vehicle::temp << std::endl; 
    std::cin.get(); 
    return 0; 
} 

main에 액세스하고 classname 다음에 ::과 변수 이름을 입력하십시오.

+0

아직 초기화해야합니다 ... –

+0

@MehdiKaramosly 무엇을 의미합니까? 나는 main 내부의 값을 할당한다. 클래스 밖에서 정의 할 때 초기 값을주지 않는 것이 좋습니다. – taocp

+0

이제 훨씬 더 좋아 보입니다. 외부에서 초기화하지 않고 실수로 사용하면 임의의 값을 갖게됩니다. (메모리에 있던 값) 그래서 그것을 외부 초기화하는 것이 현명합니다. –