Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно расставить #include'ы 
:(
    Опции темы
Royan
  Дата 6.7.2004, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Имеется следующая конструкция

Код
//файл Base.h
class Base{
 Child ch;// Это объект ребенка и он здесь очень нужен
};


Код
//Файл Child.h
class Child : public Base{
 //...
};


Требуется расставить инструкции #include чтобы ничего не сглючило baaa.gif Признатся я как будто думал что это сделать можно....


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
_hunter
Дата 6.7.2004, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



в Base.h пишеш #include Child.h


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Royan
Дата 6.7.2004, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Цитата
в Base.h пишеш #include Child.h


Так нельзя, так как первым будет вложен Child.h и там где происходит public Base{ класс Base будет еще не определен


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
_hunter
Дата 6.7.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



сорри не заметил наследования

по-моему так как ты хочеш -- сделать нельзя
возможно задачу иначе решать нужно ( через виртуальные методы хотя бы )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
cardinal
Дата 6.7.2004, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



А там и там оба includ'a написать?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Royan
Дата 6.7.2004, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Цитата
А там и там оба includ'a написать?


А конкретнее можно?



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
sergejzr
Дата 6.7.2004, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Попробуй так: Заметь, в классе "Base" находится указатель на обьект "Child".
Код
//файл Base.h
#ifndef BASE_H
 #define BASE_H
 #include "Child.h"
#endif //BASE_H

class Child;
class Base{
Child *ch;// Это объект ребенка и он здесь очень нужен
};




Код
//Файл Child.h
#ifndef CHILD_H
 #define CHILD_H
 #include "Base.h"
#endif //CHILD_H

class Child : public Base{
//...
};


Вообще пересмотри архитектуру классов. Часто без таких извращений можно обойтись smile.gif

Ещё один выход хранить указатель на Base (ведь Child тот же Base). А в cpp файле в функциях, где тебе нужен Child делать преобразование:
Код
Base *a;
Child *help=(Child*)a;

Потом сможешь вызывать функции Child'а.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
maxim1000
Дата 6.7.2004, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата

Код
//файл Base.h
class Base{
Child ch;// Это объект ребенка и он здесь очень нужен
};

Код
//Файл Child.h
class Child : public Base{
//...
};


так нельзя в принципе
ни один объект какого-нибудь класса не может содержать объекта того же или производного класса
(ну как может к примеру программист быть составной частью человека smile.gif)
к тому же, если порассуждать, размер такого объекта будет бесконечен...
Цитата

Код
//файл Base.h
#ifndef BASE_H
#define BASE_H
#include "Child.h"
#endif //BASE_H

class Child;
class Base{
Child *ch;// Это объект ребенка и он здесь очень нужен
};


а зачем вообще подключать "Child.h"? достаточно того, что класс предварительно объявлен


--------------------
qqq
PM WWW   Вверх
mr.DUDA
Дата 6.7.2004, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Можно пойти вот таким путём с пом. ссылок, если не хочется указателей (как предложил sergej.z), но только придётся обязательно инициализировать ссылку в конструкторах всех дочерних классов:
Цитата
// Base.h

class Child;

class Base 
{
public:
   
Child &m_child;
   
Base(Child &child): m_child(child) {}
};

и
Цитата
// Child.h

#include "Base.h"

class Child : public Base 
{
public:
   
Child(Child &ch): Base(ch) {}
};


З.Ы. кстати, а зачем в классе Child (унаследованном от Base) иметь объект класса Child ?...
withstupid.gif


--------------------
user posted image
PM MAIL WWW   Вверх
chipset
Дата 7.7.2004, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Может надо кольцевой список, когда последний обьект указывает на первый или что то типа этого? withstupid.gif


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
cardinal
Дата 7.7.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
А конкретнее можно?

Код

#include "Child.h"
#include "Base.h"
//файл Base.h
class Base{
Child ch;// Это объект ребенка и он здесь очень нужен
};

Код

#include "Child.h"
#include "Base.h"
//Файл Child.h
class Child : public Base{
//...
};

но это просто предположение...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
BraM's
Дата 7.7.2004, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



Я предлагаю использовать *.срр файл. например файл child.cpp

Код

#include "base.h"
#include "child.h"


У меня заработало. Я вообще считаю, что обьявление инклудов в Н-файлах - плоховастый тон программирования, по крайней мере для меня. Я обхожусь без этого.
PM MAIL ICQ   Вверх
gray_k
Дата 7.7.2004, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Цитата
Я вообще считаю, что обьявление инклудов в Н-файлах - плоховастый тон программирования

????????????????????????????????????????????????????????????
Почему. Интересно, а у Вас большой опыт программирования?


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Олег М
Дата 7.7.2004, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Внчале каждого хёдера пиши
Код
#pragma once

и не парься
PM MAIL ICQ   Вверх
chipset
Дата 7.7.2004, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Олег М
Ты пробовал?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1326 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.