| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как правильно расставить #include'ы |
| Автор: Royan 6.7.2004, 20:13 | ||||
Имеется следующая конструкция
Требуется расставить инструкции #include чтобы ничего не сглючило |
| Автор: _hunter 6.7.2004, 20:16 |
| в Base.h пишеш #include Child.h |
| Автор: Royan 6.7.2004, 20:23 | ||
Так нельзя, так как первым будет вложен Child.h и там где происходит public Base{ класс Base будет еще не определен |
| Автор: _hunter 6.7.2004, 20:27 |
| сорри не заметил наследования по-моему так как ты хочеш -- сделать нельзя возможно задачу иначе решать нужно ( через виртуальные методы хотя бы ) |
| Автор: cardinal 6.7.2004, 20:44 |
| А там и там оба includ'a написать? |
| Автор: Royan 6.7.2004, 20:53 | ||
А конкретнее можно? |
| Автор: sergejzr 6.7.2004, 21:52 | ||||||
Попробуй так: Заметь, в классе "Base" находится указатель на обьект "Child".
Вообще пересмотри архитектуру классов. Часто без таких извращений можно обойтись Ещё один выход хранить указатель на Base (ведь Child тот же Base). А в cpp файле в функциях, где тебе нужен Child делать преобразование:
Потом сможешь вызывать функции Child'а. |
| Автор: maxim1000 6.7.2004, 23:07 | ||||||||||
так нельзя в принципе ни один объект какого-нибудь класса не может содержать объекта того же или производного класса (ну как может к примеру программист быть составной частью человека к тому же, если порассуждать, размер такого объекта будет бесконечен...
а зачем вообще подключать "Child.h"? достаточно того, что класс предварительно объявлен |
| Автор: mr.DUDA 6.7.2004, 23:29 | ||||
Можно пойти вот таким путём с пом. ссылок, если не хочется указателей (как предложил sergej.z), но только придётся обязательно инициализировать ссылку в конструкторах всех дочерних классов:
и
З.Ы. кстати, а зачем в классе Child (унаследованном от Base) иметь объект класса Child ?... |
| Автор: chipset 7.7.2004, 03:24 |
| Может надо кольцевой список, когда последний обьект указывает на первый или что то типа этого? |
| Автор: cardinal 7.7.2004, 08:27 | ||||||
но это просто предположение... |
| Автор: BraM's 7.7.2004, 08:37 | ||
Я предлагаю использовать *.срр файл. например файл child.cpp
У меня заработало. Я вообще считаю, что обьявление инклудов в Н-файлах - плоховастый тон программирования, по крайней мере для меня. Я обхожусь без этого. |
| Автор: gray_k 7.7.2004, 08:41 | ||
???????????????????????????????????????????????????????????? Почему. Интересно, а у Вас большой опыт программирования? |
| Автор: Олег М 7.7.2004, 08:44 | ||
Внчале каждого хёдера пиши
и не парься |
| Автор: chipset 7.7.2004, 08:50 |
| Олег М Ты пробовал? |
| Автор: Олег М 7.7.2004, 08:55 |
| chipset Вроде да |
| Автор: Royan 7.7.2004, 09:20 | ||||||||
Реально в качестве Base выступает файл CMyDoc, а в качестве Child - CMyFile. CMyDoc должен работать с данными, однако инкапсулировать работу с файлом я решил внутри класса производного от него (что помойму логично). Так вот мне была позарез необходима реализация CMyFile, и видимо действиельно вариант пойти путем предложенным mr.DUDA или sergej.z представляется более логичным, чем тот который придумал я Моя идея такова:
Добавлено @ 09:22 2cardinal Ошибка будет та же, что и с вариантом изначально предоженным _hunter'ом Добавлено @ 09:26 2Олег М А можно более конкретно указать куда поставить #pragma once ;) На самом деле проблема действительно не имеет решения, так подобные инклюды рекурсивны по своей сути, а внедрение объекта должно происходить уже в обход правил математики, то есть или указателем или ссылкой. |
| Автор: Олег М 7.7.2004, 09:27 | ||||||
| Royan Тебе в base.cpp нужно добавить base.h. А в заголовках сделай child.h
// Base.h
Добавлено @ 09:28 Вернее
|
| Автор: Royan 7.7.2004, 09:32 |
| дефайны я опускаю для простоты изложения |
| Автор: Олег М 7.7.2004, 09:45 | ||
| Royan Ясно. Сейчас первый вопрос посмотрел повнимательнее. Действительно хитро. Оно тебе надо? Используй указатель, или ссылку если сильно хочется.
|
| Автор: BraM's 7.7.2004, 12:28 | ||
Обижаете... седьмой год этим парюсь |
| Автор: lynx_916 7.7.2004, 12:58 | ||||||||||
из десяти?
память динамически выделяешь, а про деструктор забыл? |
| Автор: Royan 7.7.2004, 13:34 | ||
Не забыл, здесь разбирается кокретный случай а все остальное детели.... |
| Автор: sergejzr 7.7.2004, 13:49 | ||
| Указатель или ссылка - это по вкусу Но одно из двух. Иначе не получится по вышеописсаным причинам. Я просто охотней с указательями работаю.. Всё же, я бы в классе Base поставил указатель или ссылку на Base а не на Child.
Это тоже по вкусу Плохой тон ИМХО, это когда код не читатеся и вообще плохо понятен. А я например люблю как в JAVA один класс - два файла (*.h, *.cpp). За исключением вспомогательных классов конечно же. PS____________________________________________________ Ах да, в моём примере конечно #endif на конец файла надо ставить. |