Круговая зависимость с двойной отправкой

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

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

заголовок 1:

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

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

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

заголовок 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, Любой совет, чтобы решить эту проблему?

1

Решение

Вперед объявить 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);
}
2

Другие решения


По вопросам рекламы [email protected]