Статическая переменная C++ выдает фатальную ошибку LNK1120: 1 неразрешенный внешний вид в Visual Studio
Я новичок в C++ и пытаюсь изучить различные варианты использования статического ключевого слова. Я прочитал, что одним из них является определение статической переменной внутри класса и вызов ее с помощью оператора области действия. Я пытался использовать это, но Visual Studio 2012 выдает ошибку компоновки. Мой код:
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: неразрешенный внешний символ "public: static int Vehicle::temp" (? Temp @ Vehicle @@ 2HA)
1> c: \ users \ avraam \ documents \ visual studio 2012 \ Projects \ LearningC++ \ Debug \ LearningC++. Exe: фатальная ошибка LNK1120: 1 неразрешенный внешний код
Что может вызвать эту проблему?
Edit1 (чтобы сделать его более понятным):
Мой вопрос, как я могу получить доступ к статической переменной, объявленной внутри класса? Возможно ли это без использования функции-члена?
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 ;
Обратите внимание, вам не нужно static
Ключевое слово, когда вы определяете temp
, Так как это static
вам не нужен экземпляр класса для доступа к переменной, поэтому код, который вы использовали в main
верно:
Vehicle::temp=100;
std::cout << Vehicle::temp << std::endl;
Vehicle v1 ;
v1.useTemp() ;
std::cout << Vehicle::temp << std::endl;
Вы должны определить 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
с именем класса, за которым следует ::
и имя переменной.