Модераторы: 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   Вверх
Олег М
Дата 7.7.2004, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



chipset
Вроде да

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


Dreamer
***


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

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



Цитата
а зачем в классе Child (унаследованном от Base) иметь объект класса Child

Реально в качестве Base выступает файл CMyDoc, а в качестве Child - CMyFile. CMyDoc должен работать с данными, однако инкапсулировать работу с файлом я решил внутри класса производного от него (что помойму логично). Так вот мне была позарез необходима реализация CMyFile, и видимо действиельно вариант пойти путем предложенным mr.DUDA или sergej.z представляется более логичным, чем тот который придумал я smile.gif

Моя идея такова:
Цитата
// Base.h

class Base 
{
    PVOID m_child;   
};

Цитата
//Base.cpp
#include "Base.h"
#include "Child.h"

Base::Base(){
  m_child =
new Child;
  ((Child *)(m_child))->nField = 100);
//Доступ к члену класса
}

Цитата
// Child.h
#include "Base.h"

class Child : public Base 
{
public:
 
int nField;
};

Добавлено @ 09:22
2cardinal Ошибка будет та же, что и с вариантом изначально предоженным _hunter'ом

Добавлено @ 09:26
2Олег М А можно более конкретно указать куда поставить #pragma once ;)

На самом деле проблема действительно не имеет решения, так подобные инклюды рекурсивны по своей сути, а внедрение объекта должно происходить уже в обход правил математики, то есть или указателем или ссылкой.

Это сообщение отредактировал(а) Royan - 7.7.2004, 09:32


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


Опытный
**


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

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



Royan
Тебе в base.cpp нужно добавить base.h. А в заголовках сделай
child.h
Код

#ifndef _CHILD_
#define _CHILD_
#include "Base.h"

class Child : public Base  
{
public:
 int nField;
};
#endif


// Base.h
Код
#ifndef _CHILD_
#define _CHILD_

class Base  
{
   PVOID m_child;    
};
#endif

Добавлено @ 09:28
Вернее
Код
#ifndef _BASE_
#define _BASE_

class Base  
{
  PVOID m_child;    
};
#endif

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


Dreamer
***


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

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



дефайны я опускаю для простоты изложения smile.gif а насчет Base.h твоя правда забыл вписать, сейчас исправил


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


Опытный
**


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

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



Royan
Ясно. Сейчас первый вопрос посмотрел повнимательнее. Действительно хитро. Оно тебе надо? Используй указатель, или ссылку если сильно хочется.
Цитата

class Child;
class Base 
{
  Child *m_pChild;   
};


PM MAIL ICQ   Вверх
BraM's
Дата 7.7.2004, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Обижаете... седьмой год этим парюсь smile.gif

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


Опытный
**


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

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



Цитата
седьмой год

из десяти?
Цитата
Моя идея такова:

Цитата
Цитата
// Base.h

class Base 
{
    PVOID m_child;   
};




Цитата
Цитата
//Base.cpp
#include "Base.h"
#include "Child.h"

Base::Base(){


  m_child = new Child;
  ((Child *)(m_child))->nField = 100);//Доступ к члену класса
}



Цитата
Цитата
// Child.h
#include "Base.h"

class Child : public Base 
{
public:
  int nField;
};



память динамически выделяешь, а про деструктор забыл?


--------------------
Who dares, wins. (с) Solid Snake
PM MAIL ICQ YIM MSN   Вверх
Royan
Дата 7.7.2004, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



Цитата
память динамически выделяешь, а про деструктор забыл?

Не забыл, здесь разбирается кокретный случай а все остальное детели....


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


Un salsero
Group Icon


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

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



Указатель или ссылка - это по вкусу smile.gif
Но одно из двух. Иначе не получится по вышеописсаным причинам.
Я просто охотней с указательями работаю..

Всё же, я бы в классе Base поставил указатель или ссылку на Base а не на Child.

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

Это тоже по вкусу smile.gif
Плохой тон ИМХО, это когда код не читатеся и вообще плохо понятен.
А я например люблю как в JAVA один класс - два файла (*.h, *.cpp).
За исключением вспомогательных классов конечно же.

PS____________________________________________________
Ах да, в моём примере конечно #endif на конец файла надо ставить.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1071 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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