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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимозависимые заголовочные файлы 
V
    Опции темы
Cheese
Дата 28.7.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здрасьте, такой дурацкий вопрос: как спроектировать программу, если по смыслу класс, описанный в заголовочном файле A.hpp требует класса, описанного в файле B.hpp, а класс, описанный в B.hpp требует класса из A.hpp? Гугл ответа не дал.
PM MAIL   Вверх
boostcoder
Дата 28.7.2012, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



общее вынести в отдельный класс(возможно абстрактный), и подключать его в A и B.

PM WWW   Вверх
borisbn
Дата 28.7.2012, 23:55 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



или в h-никах предобъявить классы
Код

//a.h
class B;
class A {
    A( B* b ) : m_b( b ) {}
    B * m_b;
    void foo_a();
};
//b.h
class A;
class B {
    B( A* a ) : m_a( a ) {}
    A * m_a;
    void foo_b();
};
//a.cpp
#include "b.h"
void A::foo_a() {
    m_b->doSomeThing();
}
//b.cpp
#include "a.h"
void B::foo_b() {
    m_a->doSomeThingElse();
}

Цитата(Cheese @  28.7.2012,  22:55 Найти цитируемый пост)
Гугл ответа не дал. 

плохо искал - http://stackoverflow.com/questions/346058/...es-organization


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Cheese
Дата 30.7.2012, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё какие-нибудь варианты есть? Потому что общего в файлах нет, абстрактный класс не вариант, а предопределения классов дают ошибки.
PM MAIL   Вверх
borisbn
Дата 30.7.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Cheese @  30.7.2012,  12:30 Найти цитируемый пост)
предопределения классов дают ошибки

если всё правильно сделал ошибок быть не должно. показывай, что сделал и какие ошибки


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 30.7.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Cheese @  28.7.2012,  22:55 Найти цитируемый пост)
 A.hpp требует класса, описанного в файле B.hpp, а класс, описанный в B.hpp требует класса из A.hpp

хорошо ли это? возникает мысль о неправильном распределении классов по заголовкам.
PM MAIL   Вверх
boostcoder
Дата 30.7.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(baldina @  30.7.2012,  13:04 Найти цитируемый пост)
хорошо ли это? возникает мысль о неправильном распределении классов по заголовкам.

я об этом и написал.
но кому-то логичнее лечить последствия ;)

PM WWW   Вверх
disputant
Дата 30.7.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хочется верить, что в одном классе успользуются только указатели на другой, потому что если каждому надо знать о внутренностях другого - то 100% надо переделывать проект...

PM MAIL   Вверх
Cheese
Дата 31.7.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Содержание примерно следующее: есть класс "объект", который, понятно, описывает объекты, типа камней, деревьев и монстров. Есть класс "событие", который содержит некоторое действие и объект, его совершивший. Теперь я хочу добавить объектам память, то есть список событий, который они видели, потому и получаются взаимозависимости такие. 
PM MAIL   Вверх
korian
Дата 31.7.2012, 17:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не компилил, но идея должна быть понятна

Код

//object.h
#include <vector>

class event;

class object {
public:
   virtual void processEvents();
private:
   std::vector<event*> events;
}

//object.cpp
#include <event.h>

void object:processEvents() {
   events.back().getObject();
}

//event.h

class object;

class event {
public:
    object * getObject() {return obj;}
private:
   object* obj;
}

PM   Вверх
Cheese
Дата 2.8.2012, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Следующий код не работает, выдаёт ошибку "invalid use of incomplete type"

Код

/* brain.hpp */
class object;

class brain
{
    private:
        object* subject;
    public:
        void foo();
};



/* brain.cpp */
#include "brain.hpp"

void brain::foo()
{
    subject -> foo();
}



/* object.hpp */
#include "brain.hpp"

class object
{
    private:
    public:
        void foo();
};



/* object.cpp */
#include "object.hpp"

void object::foo()
{
}

int main()
{
}

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


Опытный
**


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

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



в
/* brain.cpp */
добавте
#include <object.hpp>

короче в хидерах - только declarations,
а в cpp файлых, уже все должно быть известно, поэтому там инклуды.


Это сообщение отредактировал(а) korian - 2.8.2012, 11:22
PM   Вверх
Cheese
Дата 2.8.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(korian @ 2.8.2012,  11:20)
в
/* brain.cpp */
добавте
#include <object.hpp>

короче в хидерах - только declarations,
а в cpp файлых, уже все должно быть известно, поэтому там инклуды.

Спасибо большое, помогло  smile 
PM MAIL   Вверх
mes
Дата 3.8.2012, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  28.7.2012,  22:07 Найти цитируемый пост)
общее вынести в отдельный класс

Цитата(borisbn @  28.7.2012,  22:55 Найти цитируемый пост)
или в h-никах предобъявить классы

Цитата(boostcoder @  30.7.2012,  12:29 Найти цитируемый пост)
я об этом и написал


Дежавю .. и вроде в тех же лицах..

Добавлено через 3 минуты и 53 секунды
точно :
http://forum.vingrad.ru/forum/topic-341740...2581/index.html

повторяется.. даже не смотря на  
Цитата(boostcoder @  14.11.2011,  13:35 Найти цитируемый пост)
я больше не буду 



Это сообщение отредактировал(а) mes - 3.8.2012, 22:34


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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