2015-05-22 2 views
1

Я пытаюсь реализовать шаблон двойной отправки, но получаю круговую зависимость, которую я не могу разрешить с помощью прямого объявления (поскольку это было разрешено в этой задаче link).Циркулярная зависимость с двойной отправкой

Ниже приведен пример моей проблемы:

заголовка 1:

Заголовок 2:

class Collection 
{ 
public: 
    void add(const Blockage& b) 
    { ... } 

    void add(const Boundary& b) 
    { ... } 

    ... 

private: 
    boost::unordered_set<Boundary> m_boundaries; 
    boost::unordered_set<Blockage> m_blockages; 
} 

Я не вперед объявить Boundary и Blockage в заголовке 2, так как Мне нужен полный тип для использования boost::unordered_set. Любые советы по решению этой проблемы?

ответ

2

Вперед объявить Collection в заголовке 1 и перенести реализации для dispatchAdd из файла заголовка и в исходный файл.

objects.h (т.е. "заголовок 1"):

class Collection; 

class Object 
{ 
    virtual void dispatchAdd(Collection& c) const = 0; 
}; 

class Blockage: Object 
{ 
    virtual void dispatchAdd(Collection& c) const; 
}; 

class Boundary: Object 
{ 
    virtual void dispatchAdd(Collection& c) const; 
}; 

objects.cpp

#include "objects.h"  // i.e. "header 1" 
#include "collection.h" // i.e. "header 2" 

void Blockage::dispatchAdd(Collection& c) const 
{ 
    c.add(*this); 
} 

void Boundary::dispatchAdd(Collection& c) const 
{ 
    c.add(*this); 
} 
+0

Semi связанных ... Перемещение реализаций 'add' в заголовке 2 в соответствующий исходный файл. Держите заголовки простыми и чистыми! –

+0

Спасибо, и да, 'add' не реализован в заголовке 2, я не знаю, почему я добавил скобки в примере. – dlavila

Смежные вопросы