Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
1

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

11.09.2013, 19:52. Показов 6741. Ответов 44
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здрасти!

Имеем простецкий код:
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;" - не помогает).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2013, 19:52
Ответы с готовыми решениями:

Объявление классов
Только начинаю изучать С++, смотрю видеоуроки. Там показано такое объявление классов (среда...

Объявление взаимодействующих классов
Здравствуйте. Возникла проблема с объявлением классов. Вот код (суть описана в комментариях): ...

Объявление статических констант шаблонных классов
Что-то я туплю - дан шаблонный класс, принимающий в качестве аргументов шаблона типы Type1 и Type2....

Работа с классами. Объявление классов наследования - C++
На языке С++ разработать класс, описывающий точку на плоскости. Реализовать методы ввода и...

44
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.09.2013, 19:55 2
Для этого существуют заголовочные файлы, в них описываются классы, а реализации выносятся в .cpp
0
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
11.09.2013, 20:39  [ТС] 3
Цитата Сообщение от castaway Посмотреть сообщение
Для этого существуют заголовочные файлы
И какая будет разница, если я все эти классы перенесу в заголовочный файл и прикреплю его? Они также будут определяться в определенном порядке...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.09.2013, 20:46 4
Цитата Сообщение от BESSON_off Посмотреть сообщение
Они также будут определяться в определенном порядке...
Какая разница в каком порядке они будут определяться? Главное что такие ошибки больше не будут появляться.
0
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
13.09.2013, 15:22  [ТС] 5
Есть еще какие-нибудь варианты решения этой проблемы?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
13.09.2013, 16:16 6
BESSON_off, скорее всего вот здесь:
C++
1
HeadNode() {myNext = new TailNode;}
компилятор еще не знает, что вы наследуете TailNode от Node, однако указатель указывает на Node. Конечно так можно делать указатели на наследники совместимы с указателями на базовый класс, но повторюсь компилятор еще не знает о наследовании TailNode.

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

Не по теме:

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



Не по теме:

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

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

Не по теме:

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

0
Jupiter
13.09.2013, 22:36
  #12

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 23:04 13

Не по теме:

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

Не по теме:

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

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



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

Не по теме:

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

0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 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;
}
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
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 {};
0
alsav22
16.09.2013, 11:35
  #16

Не по теме:

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

0
Ilot
16.09.2013, 11:49
  #17

Не по теме:

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

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

0
alsav22
16.09.2013, 12:32
  #18

Не по теме:

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

0
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
18.09.2013, 15:31  [ТС] 19
Цитата Сообщение от Jupiter Посмотреть сообщение
потому и делают: один класс - один хедер и один файл реализации
Т.е. вы хотите сказать, что создавая класс, эффективнее будет, создать новый CPP-файл, в котором описать этот класс, далее заинклудить его в файле с main-функцией?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
18.09.2013, 15:34 20
Цитата Сообщение от BESSON_off Посмотреть сообщение
CPP-файл, в котором описать этот класс, далее заинклудить его
да, надо создать CPP файл
нет, cpp файлы никуда не инклудятся.
кто вообще пустил этот вреднейший слух, что если программа разбита на файлы, то их надо инклюдить?
их даже компилировать надо каждого по-отдельности!
1
18.09.2013, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2013, 15:34
Помогаю со студенческими работами здесь

Объявление и определение функции
В учебнике такой код: void somefunction(int); int main() { //неважно }

Объявление и определение шаблонного класса
Добрый вечер, мастера :) Почему данный код вызывает проблемы у компилятора? // class.h...

объявление и определение функции класса
почему не компилируется #include <iostream> int main(){ class A { public: A(); //...

Предварительное объявление классов. Вызвать функцию до реализации класса
Приветствую, народ. Пытаюсь реализовать структуру типа патерна "Посредник". И при реализации...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru