2015-01-28 2 views
2

У меня есть 5 классов (A, B, C, D, E), каждый из которых будет иметь свои собственные файлы классов и заголовков.Сложная круговая зависимость между классами

class A{}; 
class B 
{ 
    B(A&a); 
}; 
class C 
{ 
    C(B&b); 
}; 
class D:public A 
{}; 
class E:public D 
{ 
    vector<C*> vc; 
}; 

Вперед декларация не будет работать, потому что у меня также есть много sharepointers, используемых в каждом из этих классов.

+0

Элементы класса 'std :: shared_ptr' могут использоваться с неполными типами. Тип должен быть полным при вызове 'make_shared' (или' shared_ptr' вручную создается из необработанного указателя), поэтому это должно быть сделано в файле реализации после включения всех соответствующих заголовков, а не встроенных в класс. –

+0

Что вы думаете? –

ответ

4

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

Заголовок:

struct A; 
shared_ptr<A> create_A(); 

Impl:

struct A { ... }; 
struct A_destroyer { void operator()(A *p) { delete p; } }; 
shared_ptr<A> create_A() { return shared_ptr<A>(new A(), A_destroyer()); } 
+1

Вам это не нужно - каждый класс может объявить деструктор и определить его в источнике, включая заголовок для разрушенного типа. (Кроме того, ваш разрушитель похож на утечку памяти) –

+0

tohava дает мне правильный ответ, спасибо tohava – user0175554

0

Каждый класс может объявить деструктор и определить, что деструктор в источнике, включая заголовок для соответствующего типа деградировавших уникальной/общий указатель. Тогда простейшая форматировка этого типа в заголовке сделает это.

#include <memory> 

// header B 
struct A; 
struct B { 
    ~B(); 
    std::shared_ptr<A> a; 
}; 

// header A 
struct A {}; 

// source B 
#include "a" 
#include "b" 
B::~B() {} 
Смежные вопросы