Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
#1

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

30.05.2012, 12:02. Просмотров 611. Ответов 12
Метки нет (Все метки)

Есть класс:
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 переменные использовать в классе. Необходимо чтобы во всех объектах были одинаковые значения, изменять которые можно так же во всех объектах и чтобы изменялись они сразу во всех объектах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 12:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Компилятор ругается на static переменные (C++):

Ругается компилятор - C++
Компилирую программу: // Proba2.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <vector>...

Компилятор не ругается - C++
Компилятор по разному реагирует на 2 указателя на строки (см.комментарии). В связи с этим появился вопрос - где хранятся аргументы...

ругается компилятор: - C++
#include <stdio.h> #include <iostream> #include <process.h> #include <conio.h> #include <math.h> float a,b; ...

Компилятор ругается - C++
Условие Создать класс, содержащий сведения о количестве изделий, собранный сборщиками цеха за неделю. Класс должен содержать следующие...

Ругается компилятор - C++
Создать класс жидкость, имеющий название (указатель на строку), плотность. Определить конструкторы, деструктор и операторы вывода в поток....

Static переменные - C++
Написал небольшую программу, подключил к проекту name.h файл. В нем описание переменных static int a, b; Почему их значения можно...

12
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
30.05.2012, 12:12 #2
статческие переменные надо инициализировать вне описания класса
C++
1
Node* Node::first = 0;
0
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 18:48  [ТС] #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;
Но я совсем не понимаю где это сделать и как.
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
30.05.2012, 18:51 #4
Зачем Вам статические данные в этом классе?
0
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
30.05.2012, 19:25  [ТС] #5
Ну необходимы... Они служат указателями на первый и последний элемент.

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

компилятор с++ 2012 ругается - C++
Алгоритмы накопления y=x - sqrt(abs(x)); x=(0.98,0.52,0.77,-0.67,-0.14); n=5 #include &quot;stdafx.h&quot; #include...

компилятор ругается на структуру - C++
попалась вот такая вот структура для графа, но компилятору она не нравится.... template &lt;class V, class E&gt; struct graph { ...

Почему ругается компилятор - C++
#include &lt;iostream&gt; using namespace std; int main() { int a; cin.get(a); system(&quot;pause&quot;); }

Компилятор ругается на цикл for - C++
Есть код: #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;sstream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;iterator&gt; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.