2016-04-28 7 views
1

私はおそらくすでに答えを知っていますが、誰かがより良いアイデアを考え出すことができるかどうかを知りたいのです。C++折り返しが含まれています

大きなライブラリでは、相互参照を行う多くのクラスがあります。私はこれらのクラスを前方宣言することでこれを解決します。しかし、使いやすさのために、私は通常、このようなshared_ptrに表示できるのクラスの参照型を定義:A::Ref a代わりのstd::shared_ptr<A> a

class A : public B { 
public: 
    typedef std::shared_ptr<A> Ref; 
}; 

非常に良く参照を可能にします。私が今見ている問題は、このようなRefを使用すると実際にそのヘッダファイルをインクルードする必要があり、循環インクルードにつながるということです。 XCodeはこのような共有ポインタを使用しているvarsのために完全に偽の値を表示するので、前方宣言を含むファイルでRef型を定義することはできません。

両方を行うには他にどのようなオプションがありますか?Refを実際のタイプで定義しますが、そのタイプを含むヘッダーを含める必要はありませんか?

答えて

1

実際にこの問題を解決できるかどうかはわかりません。

しかし、コードをもっときれいにするだけなら、ロジックを少し変更することができます。

名前空間を持っているあなたのtypedefを定義する参照。たとえば:

namespace Refs { typedef std::shared_ptr<::A> A; } 
ので

、代わりのA::Ref、あなたはRefs::Aを使用しています。私はそれがやや論理的ではないことに同意するが、少なくともタイプするのはそれほど長くはない。今では、さまざまなヘッダーで必要な場所でこのようなtypedefを定義し、最終的にそれらを宣言することができます(クラスを先に宣言することを前提として)。

その他のオプション私があなただったら、私は、これのために何をするのか

しかし、実際には、std::shared_ptrのために(これはC++ 11が必要)エイリアスを使用している:

template<class T> using Ref = std::shared_ptr<T>; 

その後、あなたはどのクラスや名前空間にも宣言する必要はありません。より柔軟で明確なRef<A>を使用してください。

+0

これはおそらく行く方法です。上記の/囲む名前空間のAに前方宣言を追加し、それをヘッダーに入れます。 – Kent

+0

Ref <>テンプレートエイリアスは実際にはここでは最高の解決策であり、2つの条件を完全に満たしています。 –

関連する問題