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

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

Войти
Регистрация
Восстановить пароль
 
 
ФараоН
Заблокирован
#1

Рекурсивный include, как грамотней сделать? - C++

19.03.2014, 21:45. Просмотров 489. Ответов 16
Метки нет (Все метки)

Привет! Что - то я совсем онубел Есть два класса, вот их хэдэры:
C++
1
2
3
4
5
6
7
8
9
10
//Base.h
#pragma once
#include "Child.h"
class Base
{
public:
    Base(void);
    virtual ~Base(void);
    Child *child;
};
C++
1
2
3
4
5
6
7
8
9
10
//Child.h
#pragma once
#include "base.h"
 
class Child : public Base
{
public:
    Child(void);
    virtual ~Child(void);
};
В общем в базовом классе Base нужен указатель на дочерний класс Child. В Child понятное дело подключаю base.h (т.к. он от него наследуется), но поскольку в базовом классе нужен указатель на Child.h, подключаю в base.h файл child.h. Но тут получается как бы рекурсивный инклюд, тоесть бэйщ ссылается на чайла, а чайлд на бейза, если убрать #pragma once, будет fatal error C1014: too many include files : depth = 1024 (т.к. рекурсия), если не убирать, то соответственно error C2504: 'Base' : base class undefined, как лучше сделать для создания указателя на дочку в бэйзе?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 21:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивный include, как грамотней сделать? (C++):

Forward declaration и рекурсивный include - C++
В обоих классах нужно использовать поля друг друга, при таком подходе: //Ship.h #include "Player.h"//Player.h - наследуется от...

Как грамотней писать код? - C++
Добрый день. 1. Как правильней перебирать контейнер (карта, хеш, список...) - обычным for(int = 0;...) или с использованием итераторов? ...

Как грамотней писать объявление указателя? - C++
Ну собственно сабж. int* a; или int *a; Куда Фен Шуй рекомендует звёздочку ставить ? :)

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h> - C++
В типизированном файле записаны названия городов и их численность. Увеличить численность каждого города на 5% (Количество жителей всегда...

#include<iostream>// подключение библиотек #include <conio.h> #include <climits> - C++
помогите для этой программы сделать блок-схему. Пожалуйста #include&lt;iostream&gt;// подключение библиотек #include &lt;conio.h&gt; #include...

Как правильно сделать #include "Sales_item.h" ? - C++
#include &lt;iostream&gt; #ifndef Sales_Item_HPP #define Sales_Item_HPP #include &quot;Sales_item.h&quot; #endif Sales_Item_HPP using namespace...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
19.03.2014, 21:50 #2
Можно использовать конструкцию #ifndef #define #endif
0
ФараоН
Заблокирован
19.03.2014, 21:53  [ТС] #3
Цитата Сообщение от fishec Посмотреть сообщение
Можно использовать конструкцию #ifndef #define #endif
А смысл? Это то же самое, что и #pragma once
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.03.2014, 21:59 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В Base.h, вместо #include "Child.h", достаточно просто:
C++
1
class Child;
1
ФараоН
Заблокирован
19.03.2014, 22:01  [ТС] #5
не, ну конечно можно создать общий файл с инклюдами и того и того или базовый класс над базовым, может интерфейсный даже, так же с инклюдами всего, но это как - то не по фэн шую .... Может есть у кого варианты?
0
DrOffset
7136 / 4277 / 964
Регистрация: 30.01.2014
Сообщений: 7,066
19.03.2014, 22:03 #6
ФараоН, слушай alsav22, он дело говорит.
0
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
19.03.2014, 22:05 #7
Что-то Вы проблему создали на пустом месте.
1. Есть файл base.h - описание базового класса.
2. Есть файл child.h производного класса,
в него включаем строку
C++
1
#include "base.h"
Итак получается, если нам нужен только базовый класс,
то подключаем base.h, если производный (или оба),
то подключаес child.h
0
ФараоН
Заблокирован
19.03.2014, 22:15  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
class Child;
Вот я олух, забыл! Спасибо!
Но, class Child надо использовать не в место, а в дополнение... Иначе при попытке создания этого классы вылетит - но апроритэйт дефаул конструктор, т.к. компилятор в бэйзе же понятия не имеет, что за чайлда ты как бы объявляешь ...
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
#include "Child.h"
class Child;
class Base
{
public:
    Base(void);
    virtual ~Base(void);
    Child *child;
};
Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
Итак получается, если нам нужен только базовый класс
тут как бы нужен указатель на производный класс в базовом классе ...
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.03.2014, 22:16 #9
Цитата Сообщение от ФараоН Посмотреть сообщение
Но, class Child надо использовать не в место, а в дополнение...
В .h не надо.
0
ФараоН
Заблокирован
19.03.2014, 22:20  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
В .h не надо.
да, верно, я чушь написал, т.к. с H файлом в бейзе опять pragma once не даст два раза включиться как бы и будет тоже самое, НО, если писать просто в base.h строку class Child; как предлагалось выше, то получается как бы ерунда, тоесть компилятор вообще не знает в base.h, что за класс как бы ты объявляешь, откуда он может знать, что где - то есть файл, в котором объявлен Child...
По этому, в при попытке создать объект класса Child, например, в конструкторе класса Base:
C++
1
2
3
4
Base::Base(void)
{
    child = new Child;  
}
получаем 'Child' : no appropriate default constructor available
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.03.2014, 22:45 #11
Цитата Сообщение от ФараоН Посмотреть сообщение
например, в конструкторе класса Base:
В файле, где этот конструктор, какие инклуды сделаны?

???
C++
1
2
#include "Base.h"
#include "Child.h"
Добавлено через 5 минут
Цитата Сообщение от ФараоН Посмотреть сообщение
'Child' : no appropriate default constructor available
Реализация конструктора по умолчанию Child имеется?
1
ФараоН
Заблокирован
19.03.2014, 22:49  [ТС] #12
Цитата Сообщение от alsav22 Посмотреть сообщение
В файле, где этот конструктор, какие инклуды сделаны?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include "Base.h"
 
Base::Base(void)
{
    child = new Child;  
}
 
 
Base::~Base(void)
{
}
Да всё, я понял, так как я захотел - сделать нельзя, т.к. классы в разных файлах, вот что я понял:
1. Наверное не целесообразно в базовом классе делать указатели на дочерние классы, лучше уж делать указатели на самого себя, тоесть на Base, а где надо - приводить их к чему надо
2. Если уж так надо сделать, лучше все инклюды выносить вообще в отдельный файл и подключать везде только его и заодно сделать этот файл прекомпайл хэдэром ...

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Реализация консторуктора по умолчанию Child имеется?
ну вот как бы всё:
C++
1
2
3
4
5
6
7
8
9
10
//Base.h
#pragma once
class Child;
class Base
{
public:
    Base(void);
    virtual ~Base(void);
    Child *child;
};
C++
1
2
3
4
5
6
7
8
9
//Base.cpp
#include "Base.h"
Base::Base(void)
{
    child = new Child;   //error C2512: 'Child' : no appropriate default constructor available !!!
}
Base::~Base(void)
{
}
C++
1
2
3
4
5
6
7
8
9
10
//Child.h
#pragma once
#include "Base.h"
class Child : Base
{
public:
    Child(void);
    ~Child(void);
    int u;
};
C++
1
2
3
4
5
6
7
8
//Child.cpp
#include "Child.h"
Child::Child(void)
{
}
Child::~Child(void)
{
}
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.03.2014, 23:22 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от alsav22 Посмотреть сообщение
#include "Base.h"
#include "Child.h"
C++
1
2
3
4
5
6
7
8
9
10
11
//Base.cpp
#include "Base.h"
#include "Child.h"
 
Base::Base(void)
{
    child = new Child;   //error C2512: 'Child' : no appropriate default constructor available !!!
}
Base::~Base(void)
{
}
1
ФараоН
Заблокирован
19.03.2014, 23:30  [ТС] #14
да, что - то я в азах запутался, вот что значит самоучка
Всё верно, конечно же alsav22. Но всё равно я подумал, что лучше сделать общий прекомпайл и вообще наверное не красиво объявлять в базовом классе - дочерние...
0
Croessmah
Эксперт CЭксперт С++
13206 / 7477 / 840
Регистрация: 27.09.2012
Сообщений: 18,388
Записей в блоге: 3
Завершенные тесты: 1
20.03.2014, 09:51 #15
Цитата Сообщение от ФараоН Посмотреть сообщение
Это то же самое, что и #pragma once
прагмы не стандартизированы, а значит компилятор может не поддерживать pragma once
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2014, 09:51
Привет! Вот еще темы с ответами:

Чем отличается #include <cstring>, #include <string> и #include <string.h>? - C++
Доброго времени суток :) Пишу свой класс и мне для нужны функции для работы со строками. Когда подключаю #include &lt;string&gt; все что мне...

ошибка в лабе не находит #include<iomanip.h> #include<conio.h> - C++
Само задание: Услуги телефонной сети оплачиваются по следующему правилу: за разговоры до A минут в месяц-C руб. а разговоры сверх...

#include как и когда? - C++
Простите великодушно за тупой вопрос, ответ на который я не нашел даже в книге &quot;для чайников.&quot; В начале программы стоят операторы...

Какая разница между #include<> и #include""? - C++
Позволите спросить несколько вопросов: 1)Какая разница между #include&lt;&gt; и #include&quot;&quot; 2)Если нужно значение объекта и я не собираюсь его...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.03.2014, 09:51
Ответ Создать тему
Опции темы

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