Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Unresolved external для статического члена класса


Автор: cia 7.8.2008, 13:44
Кажется туплю страшно, но что-то не допираю чем не нравится статический член класса...

Код

class T { public: static int i; };
int main(int argc, char* argv[]) {
  T temp;
  T::i=1;
}


Линковщик ругается:
[Linker Error] Unresolved external 'T::i' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ

Автор: mes 7.8.2008, 13:51

Код

class T { public: static int i; };
int T::i =0;  


или 

Код

class T { public: int& GetDataRef () {static int i; return i ; };


Автор: mrbrooks 7.8.2008, 14:09
статическую переменную можно не инициализировать. достаточно описать вне класса.

Автор: cia 7.8.2008, 14:14
Если i объявить внутри функции, то работает.
Я не понимаю почему не работает, когда i объявлена как член класса, т.е. когда i статична не для функции, а для всех экземпляров классов.
ЗЫ. Использую BCB 6.

Добавлено через 1 минуту и 24 секунды
Цитата(mrbrooks @  7.8.2008,  14:09 Найти цитируемый пост)
статическую переменную можно не инициализировать. достаточно описать вне класса.

А если хочется все-таки сделать не глобальную переменную, а именно член класса?

Автор: mrbrooks 7.8.2008, 14:19
я тебе и говорю про член класса.
Код

class tmp
{
private:
static int a;
static double b;
public:
static void SetA(int a_t){a=a_t}; 
static void SetB(double b_t){b=b_t};
static int GetA(){return a;};
static double GetB(){return b;};
};
int tmp::a;
double tmp::b;


Добавлено через 4 минуты и 59 секунд
использовать соответсвенно 
Код

tmp::SetA(555); // Записать
tmp::GetA();       //Прочитать

есесно если класс создаешь в отдельном файле - сий файл надо заинклюдить к реализации.

Автор: cia 7.8.2008, 15:32
А... все разобрался, спасибо за помощь.
Я не написал int T::i; вне класса. Думал, вообще-то что этого не требуется.

Автор: mes 7.8.2008, 15:32
Цитата(cia @  7.8.2008,  14:14 Найти цитируемый пост)
Я не понимаю почему не работает, когда i объявлена как член класса, т.е. когда i статична не для функции, а для всех экземпляров классов.

потому что у каждой статической переменной должно быть свое место..  При описании ее в классе , линковшик не знает куда "лучше" поместить переменную,
ну а каждый метод в реале является статической функцией со скрытым параметром this, т. е. определеная внутри метода статическая переменная имеет свое вполне определенное место..  smile 

Автор: mrbrooks 7.8.2008, 15:35
Короче говоря:
Цитата

Обьявление статического поля класса как глобальной переменной требуется для того, чтобы выделить для нее память, т.к. описание самого класса не выделяет память.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)