1

次のように単純化された循環依存関係があります。

// Bar.h
struct Bar {};

// Base.h
#include "Foo.h"
struct Bar;
struct Base {
    void func(std::shared_ptr<Foo<Bar>> foobar); // use methods of Foo in some way.
};

// Derived.h
#include "Base.h"
struct Derived : public Base {};

// Foo.h
#include "Derived.h"
template <typename T>
struct Foo {
    void func(std::shared_ptr<Derived> d) {
        // use methods of Derived in some way.
    }
};

テンプレートクラスであるため、単純に前方宣言するFooことはできません。ポリモーフィズムのために前方宣言することはできません。Base.hBaseDerived.hDerivedFoo.hFoo::funcDerived

テンプレートの実装を宣言から分離することについて前に読んだことがありますが、ベストプラクティスを認識しておらず、この場合に機能するかどうかはわかりません。この 2 つは、DerivedFooのプログラム全体で広く使用されています。

この依存関係を解決するにはどうすればよいですか?

4

2 に答える 2

2

を取る関数を宣言するstd::shared_ptr<type>のに の完全な定義は必要ありません。必要なのtypeは (前方) 宣言だけです。これにより#include、Derived.h (Foo.h 内) および/または Foo.h (Base.h 内)を回避できます。

于 2013-09-18T14:41:04.293 に答える
0

相互に参照するクラスでインライン関数を有効にします。

ヘッダーああ

struct B;
struct A { 
    void a() {}
    void f();
    std::shared_ptr<B> b;
};
#include "A.tcc"

ヘッダー A.tcc

#include B.h
inline void A::f() { b->b(); }

ヘッダ Bh

struct A;
struct B { 
    void b() {}
    void f();
    std::shared_ptr<A> a;
};
#include "B.tcc"

ヘッダー B.tcc

#include A.h
inline void B::f() { a->a(); }

すべてのファイルにヘッダー ガードがあることを確認してください。

于 2013-09-18T14:50:59.070 に答える