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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно расставить #include'ы 
:(
    Опции темы
Олег М
Дата 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0853 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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