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

Объявление и определение классов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 328
11.09.2013, 19:52     Объявление и определение классов #1
Всем здрасти!

Имеем простецкий код:
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
class Node;
class HeadNode;
class TailNode;
class Node
{
public:
Node() {}
virtual ~Node(){}
};
 
class HeadNode : public Node
{
Node * myNext;
public:
HeadNode() {myNext = new TailNode;}
~HeadNode() {delete myNext;}
};
 
class TailNode : public Node
{
TailNode() {}
~TailNode() {}
};
 
int main()
{
return 0;
}
Если скомпилить этот код, то нам покажут ошибку "TailNode: нет подходящего конструктора".
Если переставить местами классы TailNode и HeadNode, то программа заработает... Но если, после этого нам нужно добавить еще один класс, производный от Node, то нам опять придется определять, где же его расположить, чтобы он определялся до всех своих упоминаний.
Так вот - подскажите пожалуйста, как правильно объявить все классы до их определения, чтобы программа могла видеть все созданные классы, независимо от своего расположения? (так как объявил классы я "class Node;" - не помогает).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 19:55     Объявление и определение классов #2
Для этого существуют заголовочные файлы, в них описываются классы, а реализации выносятся в .cpp
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 328
11.09.2013, 20:39  [ТС]     Объявление и определение классов #3
Цитата Сообщение от castaway Посмотреть сообщение
Для этого существуют заголовочные файлы
И какая будет разница, если я все эти классы перенесу в заголовочный файл и прикреплю его? Они также будут определяться в определенном порядке...
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 20:46     Объявление и определение классов #4
Цитата Сообщение от BESSON_off Посмотреть сообщение
Они также будут определяться в определенном порядке...
Какая разница в каком порядке они будут определяться? Главное что такие ошибки больше не будут появляться.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 328
13.09.2013, 15:22  [ТС]     Объявление и определение классов #5
Есть еще какие-нибудь варианты решения этой проблемы?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
13.09.2013, 16:16     Объявление и определение классов #6
BESSON_off, скорее всего вот здесь:
C++
1
HeadNode() {myNext = new TailNode;}
компилятор еще не знает, что вы наследуете TailNode от Node, однако указатель указывает на Node. Конечно так можно делать указатели на наследники совместимы с указателями на базовый класс, но повторюсь компилятор еще не знает о наследовании TailNode.

Добавлено через 8 минут
При наследовании наследуется и конструктор базового класса и пока вы не дали команду компилятору(не разместили описание класса TailNode) конструктор TailNode не вызывает конструктор базового класса и поэтому вы имеете то что видите т.е. подходящего конструтора нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 17:02     Объявление и определение классов #7
Ilot,
Цитата Сообщение от BESSON_off Посмотреть сообщение
Есть еще какие-нибудь варианты решения этой проблемы?
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
13.09.2013, 17:18     Объявление и определение классов #8
Может просто кто-то что-то не хочет понять...
Это лишь объявление имени класса как такового (с таким определением нельзя использовать его свойства):
C++
1
class Node;
А вот это уже объявление класса с описанием членов и методов без их определения (так уже можно использовать его свойства):
C++
1
2
3
4
struct Node {
    Node();
    virtual ~Node();
};

Не по теме:

alsav22, Разве это не решает проблемы!?



Не по теме:

По большому счету это было написано для ТС.

BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 328
13.09.2013, 20:46  [ТС]     Объявление и определение классов #9
А если классов 100 и каждый обращается друг к другу, то вставляя 101 класс (по потребности) вы будете вычислять место куда же его вставить так, чтобы все обращения к нему и от него были после определения его самого и того к кому он обращается? Не верю, что все так запущено...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2013, 20:56     Объявление и определение классов #10
Цитата Сообщение от BESSON_off Посмотреть сообщение
А если классов 100 и каждый обращается друг к другу, то вставляя 101 класс (по потребности) вы будете вычислять место куда же его вставить так, чтобы все обращения к нему и от него были после определения его самого и того к кому он обращается?
потому и делают: один класс - один хедер и один файл реализации
alsav22
13.09.2013, 22:31
  #11

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Не по теме:
alsav22, Разве это не решает проблемы!?
Что сегодня за день... Решает. Я кому написал это?
Цитата Сообщение от alsav22 Посмотреть сообщение
Ilot,
Сообщение от BESSON_off
Есть еще какие-нибудь варианты решения этой проблемы?
Ilot это я написал. Почему я ему это написал? Потому что BESSON_off спрашивает есть ли ещё варианты, кроме того, который предложил castaway, а Ilot, вместо того, чтобы предложить что-либо, описывает почему у ТС это происходит(ТС ещё в первом посте написал почему).

Jupiter
13.09.2013, 22:36
  #12

Не по теме:

alsav22, ваши варианты в студию

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 23:04     Объявление и определение классов #13

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:

alsav22, ваши варианты в студию

И при чём здесь я? Я что, обещал какие-то варианты? Или писал, что предложенные меня не устраивают?



Добавлено через 7 минут

Не по теме:

Я понял, что сегодня не так... !3-е, пятница...

Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.09.2013, 16:22     Объявление и определение классов #14
Цитата Сообщение от BESSON_off Посмотреть сообщение
Есть еще какие-нибудь варианты решения этой проблемы?
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
class Node;
class HeadNode;
class TailNode;
class Node
{
public:
Node() {}
virtual ~Node(){}
};
 
class HeadNode : public Node
{
Node * myNext;
public:
HeadNode();
~HeadNode() {delete myNext;}
};
 
class TailNode : public Node
{
TailNode() {}
~TailNode() {}
};
HeadNode::HeadNode() {myNext = new TailNode;}
int main()
{
return 0;
}
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
16.09.2013, 09:23     Объявление и определение классов #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Ilot это я написал. Почему я ему это написал? Потому что BESSON_off спрашивает есть ли ещё варианты, кроме того, который предложил castaway, а Ilot, вместо того, чтобы предложить что-либо, описывает почему у ТС это происходит(ТС ещё в первом посте написал почему).
Так я и написал, что бы товарищ прежде чем использовать класс создал конструктор и деструктор для него(для команд new и delete). Как он его будет объявлять это его дело. Но уж если вопрос встал, то можно и так:
Вместо этого:
C++
1
2
class HeadNode;
class TailNode;
Написать вот так:
C++
1
2
class HeadNode;
class TailNode {};
alsav22
16.09.2013, 11:35
  #16

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
Но уж если вопрос встал, то можно и так:
Вместо этого:
C++
1
2
class HeadNode;
class TailNode;
Написать вот так:
C++
1
2
class HeadNode;
class TailNode {};
Т.е., это ваше решение этого?
Цитата Сообщение от BESSON_off Посмотреть сообщение
Так вот - подскажите пожалуйста, как правильно объявить все классы до их определения, чтобы программа могла видеть все созданные классы, независимо от своего расположения?

Ilot
16.09.2013, 11:49
  #17

Не по теме:

alsav22, в чем собственно проблема? Автору было не понятно почему у него возникает ошибка. Я объяснил.
А по поводу вот этого:

Так вот - подскажите пожалуйста, как правильно объявить все классы до их определения, чтобы программа могла видеть все созданные классы, независимо от своего расположения?
Обычное объявление классов благополучно позволяет видеть их в дальнейшем. Однако автор захотел нечто более чем просто обращение к классу, а именно вызвать его методы. Вот я и объяснил, что это невозможно пока вы их не опишите или не создадите для них прототипы. И еще раз:
Как он его(конструктор и деструктор) будет объявлять это его дело.

alsav22
16.09.2013, 12:32
  #18

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
Автору было не понятно почему у него возникает ошибка.
Вот в этом мы и расходимся.
Цитата Сообщение от BESSON_off Посмотреть сообщение
"TailNode: нет подходящего конструктора".
Цитата Сообщение от BESSON_off Посмотреть сообщение
Если переставить местами классы TailNode и HeadNode, то программа заработает...
Цитата Сообщение от BESSON_off Посмотреть сообщение
то нам опять придется определять, где же его расположить, чтобы он определялся до всех своих упоминаний.
Т.е., из этого я сделал вывод, что причина ТС известна. Может я был и не прав, не знаю. Спрашивать у ТС уже, наверное, поздно.

BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 328
18.09.2013, 15:31  [ТС]     Объявление и определение классов #19
Цитата Сообщение от Jupiter Посмотреть сообщение
потому и делают: один класс - один хедер и один файл реализации
Т.е. вы хотите сказать, что создавая класс, эффективнее будет, создать новый CPP-файл, в котором описать этот класс, далее заинклудить его в файле с main-функцией?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2013, 15:34     Объявление и определение классов
Еще ссылки по теме:

C++ Предварительное объявление классов. Вызвать функцию до реализации класса
Объявление и определение функции C++
C++ Объявление и определение шаблонного класса

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.09.2013, 15:34     Объявление и определение классов #20
Цитата Сообщение от BESSON_off Посмотреть сообщение
CPP-файл, в котором описать этот класс, далее заинклудить его
да, надо создать CPP файл
нет, cpp файлы никуда не инклудятся.
кто вообще пустил этот вреднейший слух, что если программа разбита на файлы, то их надо инклюдить?
их даже компилировать надо каждого по-отдельности!
Yandex
Объявления
18.09.2013, 15:34     Объявление и определение классов
Ответ Создать тему
Опции темы

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