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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> линкер не находит переменную класса 
V
    Опции темы
_hunter
  Дата 25.5.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Добрый день.

Помогите разобраться.
Есть такой:
Код

class Test
{
private:
    static int test;
public:
    Test() { DoTest(); };

    static void DoTest() { int num = test; };
};

при попытке это дело собрать линкер кричит:
Цитата

error LNK2001: unresolved external symbol "private: static int Test::test" (?test@Test@@0HA)


Как это побороть?

С уважением... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
likehood
Дата 25.5.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



а есть ли объявление:
Код

int Test::test;

? 
PM MAIL   Вверх
_hunter
Дата 25.5.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



в смысле? а четвертая строка это что? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
likehood
Дата 25.5.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



а кодом продемонстрировать можно? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
likehood
Дата 25.5.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



Код

class Test    
{    
private:    
    static int test;    
public:    
    Test() { DoTest(); };    
    static void DoTest() { int num = test; };    
};

int Test::test; // если эту строчку убрать, будет твоя ошибка

void main() {
    Test test1;
    cout << "ok";
}
  

Это сообщение отредактировал(а) baronp - 25.5.2006, 17:19
PM MAIL   Вверх
thealx
Дата 25.5.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(_hunter @ 25.5.2006,  16:41)
Код

class Test
{
private:
    static int test;
public:
    Test() { DoTest(); };

    static void DoTest() { int num = test; };
};


Код
int Test::test = 0;
 
PM MAIL   Вверх
_hunter
Дата 25.5.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



хм... работает.
оригинально... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
likehood
Дата 25.5.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



А иначе и быть не может. Что если статическая переменная является объектом класса? Как вызвать ее конструктор? Какие ему передать параметры? 
PM MAIL   Вверх
Earnest
Дата 25.5.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



_hunter, 
статические данные класса - это на самом деле глобальные переменные, 
разница только в области видимости, а storage тот же.
Поэтому для них действуют те же правила, что и для глобальных переменных: объявлений может быть несколько, но обязательно нужно ровно одно определение. 
 


--------------------
...
PM   Вверх
_hunter
Дата 25.5.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



в конструторе-контейнере и передавать нужные параметры...

в шарпе оно как-то логичнее... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
mostly
Дата 25.5.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня эту ошибку выдаёт g++, а у Borland C++ Compiler 5.5 всё нормально компилируется. 
PM MAIL   Вверх
likehood
Дата 25.5.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



Цитата(mostly @  25.5.2006,  18:49 Найти цитируемый пост)
а у Borland C++ Compiler 5.5 всё нормально компилируется

а ты создавал объекты класса Test? Если нет, то оно может и откомпилиться. 
PM MAIL   Вверх
mostly
Дата 25.5.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(baronp)
а ты создавал объекты класса Test? Если нет, то оно может и откомпилиться.


Да, создавал:

Код

#include <iostream>
using namespace std;

class Test
{
private:
    static int test;
public:
    Test() { DoTest(); };
    static void DoTest() { int num = test; };
    int a;
};


int main() 
{  
    Test test1;
     test1.a=5;
    cout << test1.a<<endl;

 //   system("PAUSE");
    return EXIT_SUCCESS;
}
 
PM MAIL   Вверх
DeadSoul
Дата 25.5.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(mostly @  25.5.2006,  18:31 Найти цитируемый пост)
Цитата(baronp)
а ты создавал объекты класса Test? Если нет, то оно может и откомпилиться.
Да, создавал:

А обращался к этой переменной?
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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