Статическая переменная 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 (чтобы было понятнее):

Мой вопрос: как я могу получить доступ к статической переменной, объявленной внутри класса? Возможно ли это без использования функции-члена?


person Avraam Mavridis    schedule 24.04.2013    source источник
comment
Вам нужно определить переменную. Добавьте int Vehicle::temp; после определения класса.   -  person jrok    schedule 24.04.2013


Ответы (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;
person Shafik Yaghmour    schedule 24.04.2013
comment
@AvraamMavridis Я добавил еще несколько деталей, которые, надеюсь, прояснят, как использовать temp внутри и вне класса. - person Shafik Yaghmour; 24.04.2013

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

person taocp    schedule 24.04.2013
comment
@MehdiKaramosly, что ты имеешь в виду? Я присваиваю ему значение внутри main. Можно не указывать начальное значение при определении его вне класса. - person taocp; 24.04.2013
comment
Теперь это выглядит намного лучше, если вы не инициализируете его снаружи, а затем, используя его по ошибке, у вас будет случайное значение. (значение, которое было в памяти), поэтому разумно инициализировать его снаружи. - person Mehdi Karamosly; 24.04.2013