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


Автор: _hunter 25.5.2006, 16:41
Добрый день.

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

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)


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

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

Автор: likehood 25.5.2006, 16:56
а есть ли объявление:
Код

int Test::test;

? 

Автор: _hunter 25.5.2006, 17:05
в смысле? а четвертая строка это что? 

Автор: likehood 25.5.2006, 17:08
на сколько я знаю, статические переменные принадлежат всему классу и потому должны определяться отдельно, как обычные глобальные переменные. 

Автор: _hunter 25.5.2006, 17:11
а кодом продемонстрировать можно? 

Автор: likehood 25.5.2006, 17:17
Код

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

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

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

Автор: thealx 25.5.2006, 17:19
Цитата(_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;
 

Автор: _hunter 25.5.2006, 17:26
хм... работает.
оригинально... 

Автор: likehood 25.5.2006, 17:29
А иначе и быть не может. Что если статическая переменная является объектом класса? Как вызвать ее конструктор? Какие ему передать параметры? 

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

Автор: _hunter 25.5.2006, 17:45
в конструторе-контейнере и передавать нужные параметры...

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

Автор: mostly 25.5.2006, 17:49
У меня эту ошибку выдаёт g++, а у Borland C++ Compiler 5.5 всё нормально компилируется. 

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

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

Автор: mostly 25.5.2006, 18:31
Цитата(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;
}
 

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

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

Автор: mostly 25.5.2006, 22:31
Цитата
А обращался к этой переменной?

Нет, не обращался.

Сейчас попробовал , и Borland C++ 5.5.1

выдал ошибку:

Error: Unresolved external 'Test::test' referenced from AAA.OBJ 

Автор: nikitao 25.5.2006, 22:39
Цитата(mostly @  25.5.2006,  23:31 Найти цитируемый пост)
Нет, не обращался.

Сейчас попробовал , и Borland C++ 5.5.1

выдал ошибку:

Error: Unresolved external 'Test::test' referenced from AAA.OBJ 

Вот хуже нет , когда компелятор сначала не видет ошибку, а потом ни с тог, козалось бы, ни с сего ее выдает  smile  

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