Статическая переменная 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 с именем класса, за которым следует :: и имя переменной.

Другие вопросы по тегам