Форум программистов, компьютерный форум CyberForum.ru

Компилятор ругается на static переменные - C++

Восстановить пароль Регистрация
 
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 12:02     Компилятор ругается на static переменные #1
Есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Node{
public:
    Node(void) : data(0), next(0), prev(0), first(0), last(0), size(0){}
    Node(const _My& Val){
        data = new _My(Val);
        size++;
    }
    ~Node(void){}
    _My* data;
    Node* next;
    Node* prev;
    static Node* first;
    static Node* last;
    static Node* PTR_END;
    static int size;
};
//...
//...
//...
Node* ptr = new Node();
ptr->PTR_END = ptr;
Не могу понять, почему компилятор ругается на это:
C++
1
2
first(0), last(0), size(0)
ptr->PTR_END = ptr;
Если у этих эл-в в классе убрать static, то все работает, а так ошибка "unresolved external symbol".

Добавлено через 37 минут
Может у меня с головой плохо и нельзя static переменные использовать в классе. Необходимо чтобы во всех объектах были одинаковые значения, изменять которые можно так же во всех объектах и чтобы изменялись они сразу во всех объектах.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 12:02     Компилятор ругается на static переменные
Посмотрите здесь:

Ругается компилятор C++
C++ компилятор с++ 2012 ругается
ругается компилятор: C++
Ругается компилятор C++
C++ Компилятор не ругается
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
30.05.2012, 12:12     Компилятор ругается на static переменные #2
статческие переменные надо инициализировать вне описания класса
C++
1
Node* Node::first = 0;
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 18:48  [ТС]     Компилятор ругается на static переменные #3
Помогите пожалуйста еще. У меня класс в классе:
C++
1
2
3
4
5
6
7
8
9
10
template<typename _My> class base{
 //...
 private:
  class Node{
   static Node* first;
   static Node* last;
   static int size;
  };
 //...
};
Я знаю, что сначала как то надо объявить
C++
1
2
3
Node* Node::first;
Node* Node::last;
int Node::size;
Но я совсем не понимаю где это сделать и как.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.05.2012, 18:51     Компилятор ругается на static переменные #4
Зачем Вам статические данные в этом классе?
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 19:25  [ТС]     Компилятор ругается на static переменные #5
Ну необходимы... Они служат указателями на первый и последний элемент.

Добавлено через 7 минут
Сделал для нешаблонного класса:
C++
1
2
3
4
5
6
class A{
    class B{
        static B* C;
    };
};
A::B* A::B::C;
Все работает, но с шаблоном не хочет.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.05.2012, 19:32     Компилятор ругается на static переменные #6
Вы понимаете, что эти данные разделяют между собой ВСЕ объекты этого класса, и что они существуют независимо от объектов?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.05.2012, 19:34     Компилятор ругается на static переменные #7
не нужны там статические переменные. это бред и глюк. сделайте мемберы обычными и инициализируйте их в конструкторе. при таком подходе с статическими мемберами не получится сделать больше одного экземпляра нода.
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 19:37  [ТС]     Компилятор ругается на static переменные #8
Мне необходимо, чтобы у всех объектов были одинаковыми данные поля. Мне необходимо, чтобы эти переменные были именно внутри данного класса, значит они должны быть статическими. Если этого сделать нельзя, то скажите это, буду переделывать мозги.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.05.2012, 19:41     Компилятор ругается на static переменные #9
Цитата Сообщение от Lordif Посмотреть сообщение
Мне необходимо, чтобы у всех объектов были одинаковыми данные поля.
Зачем? Смысл тогда создавать новые объекты, если они все одинаковые, и при изменении одного, будут меняться все?
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 19:45  [ТС]     Компилятор ругается на static переменные #10
В данном классе существует еще много переменных и ссылок и всего всего. Вы с завидным упорством пытаетесь отговорить меня использовать статический переменные, не могли бы вы объяснить почему.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.05.2012, 19:49     Компилятор ругается на static переменные #11
Мы не пытаемся Вас отговорить, просто мы хотим понять, что Вы хотите сделать, и подсказать Вам.
Вот Вы описали класс base, в котором описали класс node. В node статические данные. Причем указатели. Вот эти самые данные буду использоваться ВСЕМИ объектами класса node, и, получается, ВСЕМИ объектами класса base. То есть это будет всего одна переменная, например static Node* first, которая создается при запуске программы, а не какого то объекта. У Вас все объекты node всегда будут указывать в одно место first и last.
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 20:36  [ТС]     Компилятор ругается на static переменные #12
А почему всеми объектами класса base? Разве для разных объектов base не будут разные значения, ведь Node то создается всегда заново.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2012, 20:47     Компилятор ругается на static переменные
Еще ссылки по теме:

C++ Почему ругается компилятор
Static переменные C++
Компилятор ругается C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.05.2012, 20:47     Компилятор ругается на static переменные #13
Объект класса Node, но не статические данные этого класса, которые никакого отношения к объектам не имеют. Я же писал выше, статические переменные создаются всего один раз при запуске программы, и существуют все время, не зависимо от того, создан хоть один объект или объектов данного класса нет. Поэтому их и нужно инициализировать вне определения класса.
Yandex
Объявления
30.05.2012, 20:47     Компилятор ругается на static переменные
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru