Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unresolved external для статического члена класса, в чем причина ошибки? 
:(
    Опции темы
cia
Дата 7.8.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



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

Код

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
PM WWW ICQ   Вверх
mes
Дата 7.8.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250




Код

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


или 

Код

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




--------------------
PM MAIL WWW   Вверх
mrbrooks
Дата 7.8.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



статическую переменную можно не инициализировать. достаточно описать вне класса.
PM MAIL   Вверх
cia
Дата 7.8.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



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

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

А если хочется все-таки сделать не глобальную переменную, а именно член класса?
PM WWW ICQ   Вверх
mrbrooks
Дата 7.8.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



я тебе и говорю про член класса.
Код

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();       //Прочитать

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

Это сообщение отредактировал(а) mrbrooks - 7.8.2008, 14:21
PM MAIL   Вверх
cia
Дата 7.8.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



А... все разобрался, спасибо за помощь.
Я не написал int T::i; вне класса. Думал, вообще-то что этого не требуется.
PM WWW ICQ   Вверх
mes
Дата 7.8.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
mrbrooks
Дата 7.8.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Короче говоря:
Цитата

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.