Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

Нужны пояснения по вложенным классам - C++

29.01.2016, 17:34. Просмотров 234. Ответов 9
Метки нет (Все метки)

задался вот таким вопросом, почему не получается объявить вложенный класс следующим образом?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
 
    class stack
    {
    public: 
        class node;
        node*m_ob;
        
        stack() { }
    
        stack(int value) :m_ob(new node(10)) {} //ошибка здесь, недопустимый неполный тип
 
    };
 
    class stack::node
    {
        int m_value;
        node * m_next;
        node * m_prev;
 
    public:
        node() { }
        node(int val) : m_value(val), m_next(nullptr), m_prev(nullptr) { }
        void SetNext(node *& ob) { m_next = ob; }
        void SetPrev(node *& ob) { m_prev = ob; }
        int Getvalue() { return m_value; }
    };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2016, 17:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нужны пояснения по вложенным классам (C++):

Нужны пояснения
Читаю &quot;С++ руководство для начинающих&quot; Герберта Шилдта. Дочитал до &quot;передача...

Нужны некоторые пояснения
При выполнении программы есть область 20 на 20. 1) Почему при движении вправо...

Conversion by constructor , нужны пояснения
Здравствуйте. Смотрю я, что пишут об этом Conversion by constructor, вижу...

Реализация связанного списка - нужны пояснения
#include &lt;iostream&gt; using namespace std; class cool { public: ...

Синглтон Мейерса, нужны некоторые пояснения
class Singleton{ public: static Singleton&amp; init() { static...

Нужны пояснения насчет компиляторов для разных ОС
Всем привет ребят! Есть несколько вопросов: 1) Существуют различные...

9
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
29.01.2016, 17:56 #2
На данном этапе полное определение класса node ещё не доступно. Поэтому new не знает сколько выделять памяти и компилятор выдает ошибку. Вынеси реализацию конструктора stack вне класса и будет тебе счастье.
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
29.01.2016, 18:11  [ТС] #3
Tulosba, Спасибо!!

Не по теме:

Счастье вдруг, в тишине...



Добавлено через 11 минут
Tulosba, Я наверное не совсем правильно понял, но вот так пишет что у ноде нетути определенных конструкторов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
 
class stack
{
public:
    class node;
    node*m_ob;
 
    stack() { }
 
    stack(int value); //ошибка здесь, недопустимый неполный тип
 
};
 
stack::stack(int value) { m_ob=new node(10); }
 
class stack::node
{
    int m_value;
    node * m_next;
    node * m_prev;
 
public:
    node() { }
    node(int val) : m_value(val), m_next(nullptr), m_prev(nullptr) { }
    void SetNext(node *& ob) { m_next = ob; }
    void SetPrev(node *& ob) { m_prev = ob; }
    int Getvalue() { return m_value; }
};
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
29.01.2016, 18:16 #4
anti-k, после определения класса stack::node надо перенести.
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
29.01.2016, 18:30  [ТС] #5
Вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
 
class stack
{
public:
    class node;
    node*m_ob;
 
    stack() { }
 
    stack(int value); //ошибка здесь, недопустимый неполный тип
 
};
 
 
class stack::node
{
    int m_value;
    node * m_next;
    node * m_prev;
 
public:
    node() { }
    node(int val) : m_value(val), m_next(nullptr), m_prev(nullptr) { }
    void SetNext(node *& ob) { m_next = ob; }
    void SetPrev(node *& ob) { m_prev = ob; }
    int Getvalue() { return m_value; }
};
stack::stack(int value) : m_ob(new node(10)) {}
Так находит многократно определенный символ

Добавлено через 3 минуты
Tulosba, Удивительно, но когда я вынес реализацию ноде в другой файл, все зачикало !!!!
Пожалуйста, объясните хоть немного почему вынос реализации конструктора так повлиял(я туповат не сразу приезжаю), и почему был многократно определенный символ? Пожалуйста, хотя бы пару слов...

Добавлено через 7 минут
Tulosba, Я так полагаю что конструктор хочет видеть реализацию встроенного класса, что бы определить размер выделяемой памяти?
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.01.2016, 18:35 #6
anti-k,
дэки не подходят?

C++
1
2
3
4
5
6
#include <deque>
 
deque<node>  stck_nds; // stack of nodes
 
stck_nds.push_front(node);
stck_nds.pop_front(node);
аналогично
C++
1
2
3
#include <list>
 
list<int> m_val_1;
можно и динамически через new, чтоб потом и освободить всю память
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
29.01.2016, 18:37  [ТС] #7
SergioO, Тут не в контейнере дело, я новичок и таким вот путем пытаюсь набить себе шишек
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
29.01.2016, 18:47 #8
Цитата Сообщение от anti-k Посмотреть сообщение
Так находит многократно определенный символ
Вероятно потому что текущий файл ты подключаешь через #include. Как ты вообще осуществляешь сборку? Какая среда, компилятор, ОС?
Цитата Сообщение от anti-k Посмотреть сообщение
конструктор хочет видеть реализацию встроенного класса, что бы определить размер выделяемой памяти?
Не конструктор, а new. Т.к. в классе у тебя расположен только лишь указатель m_ob размер (sizeof) класса stack не зависит от размера stack::node.
1
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
29.01.2016, 18:53 #9
Цитата Сообщение от anti-k Посмотреть сообщение
многократно определенный символ
h-ник вероятно включался в несколько cpp (т.е. определение конструктора множилось), а определение функции с внешним связыванием должно быть в единственном экземпляре.

Цитата Сообщение от anti-k Посмотреть сообщение
Я так полагаю что конструктор хочет видеть реализацию встроенного класса, что бы определить размер выделяемой памяти?
Да. Почти.
1
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.01.2016, 18:55 #10
Цитата Сообщение от anti-k Посмотреть сообщение
SergioO, Тут не в контейнере дело, я новичок и таким вот путем пытаюсь набить себе шишек
Джосатис Н.М. Стандартная библиотека С++. 2014 (на rutracker.org)
открой исходник deque.cpp или list.cpp - посмотри как там.
я тоже новичок
0
29.01.2016, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2016, 18:55
Привет! Вот еще темы с решениями:

Нужны небольшие пояснения по маленькому фрагменту кода, реализующего рекурсивный поиск в глубину по графу
Здравствуйте, не могу разобраться в этой функции. Ниже есть ссылка на сам...

Структура "Student", нужны пояснения
Доброе время суток форум. Нужна помощь в объяснении программы. Хочу в ней...

Задача по вложенным циклам
Здравствуйте! Помогите растолковать код, не могу понять какой цикл к чему...

Структура с вложенным массивом структур
Здравствуйте! Хочу создать некое подобие файловой системы. есть 2 структуры...


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

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

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