1

二重ディスパッチ パターンを実装しようとしていますが、前方宣言では解決できない循環依存関係が発生します (この問題のリンクで解決されているため)。

以下は私の問題の例です:

ヘッダー 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;
}

を使用するには完全な型が必要なため、ヘッダー 2 でBoundaryandを宣言することはできません。この問題を解決するためのアドバイスはありますか?Blockageboost::unordered_set

4

1 に答える 1

2

ヘッダー 1 で前方宣言Collectionし、実装を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;
};

オブジェクト.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);
}
于 2015-05-22T16:06:16.310 に答える