Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Взаимозависимые заголовочные файлы


Автор: Cheese 28.7.2012, 22:55
Здрасьте, такой дурацкий вопрос: как спроектировать программу, если по смыслу класс, описанный в заголовочном файле A.hpp требует класса, описанного в файле B.hpp, а класс, описанный в B.hpp требует класса из A.hpp? Гугл ответа не дал.

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

Автор: borisbn 28.7.2012, 23:55
или в 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/c-class-header-files-organization

Автор: Cheese 30.7.2012, 12:30
Ещё какие-нибудь варианты есть? Потому что общего в файлах нет, абстрактный класс не вариант, а предопределения классов дают ошибки.

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

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

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

хорошо ли это? возникает мысль о неправильном распределении классов по заголовкам.

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

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

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

Автор: Cheese 31.7.2012, 15:40
Содержание примерно следующее: есть класс "объект", который, понятно, описывает объекты, типа камней, деревьев и монстров. Есть класс "событие", который содержит некоторое действие и объект, его совершивший. Теперь я хочу добавить объектам память, то есть список событий, который они видели, потому и получаются взаимозависимости такие. 

Автор: korian 31.7.2012, 17:08
Не компилил, но идея должна быть понятна

Код

//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;
}

Автор: Cheese 2.8.2012, 10:23
Следующий код не работает, выдаёт ошибку "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()
{
}

Автор: korian 2.8.2012, 11:20
в
/* brain.cpp */
добавте
#include <object.hpp>

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

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

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

Спасибо большое, помогло  smile 

Автор: mes 3.8.2012, 22:33
Цитата(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/unread-1/hl/%25D0%25B2%25D0%25AB%25D0%25BD%25D0%25B5%25D1%2581%25D1%2582%25D0%25B8+%25D0%25B2+%25D0%25BE%25D1%2582%25D0%25B4%25D0%25B5%25D0%25BB%25D1%258C%25D0%25BD%25D0%25AB%25D0%25B9+%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2581%25D1%2581/index.html

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)