4

C++ では、すべての型を使用する前に定義する必要があるため、ヘッダー ファイルを正しい順序でインクルードすることが重要になります。罰金。しかし、私の状況はどうですか:

Bunny.h:

   クラスバニー
   {
       ...
   プライベート:
       Reference<Bunny> 親;
   }

コンパイラは、独自のクラス定義で使用する時点で技術的に完全に定義されていないため、不平を言います。Bunny私は何か愚かなことをしたからです(関係のない)。

Referenceポインタ型を取るようにテンプレート クラスを書き直す以外に(この場合、 の前方宣言を使用できますBunny)、これを解決する方法がわかりません。

助言がありますか?

EDIT:Referenceのクラス(XObjectデータモードオブジェクトの基本クラスです):

テンプレート <クラス T = XObject> クラス リファレンス
{
公衆:
    Reference() : m_ptr (NULL) {}
    参照(T* p)
    {
        m_ptr = p;
        if (p != NULL) ((XObject*)p)->ref();
    }
    〜リファレンス()
    {
        もし (m_ptr)
        {
            ((XObject*)m_ptr)->deref();
        }
    }

    // ... 代入、比較など

プライベート:
    T* m_ptr;
};

編集:これはうまくいきますが、問題は別のものでした。助けてくれてどうもありがとう!

4

3 に答える 3

3

あなたの質問への答えは、 Reference<> がどのように見えるかによって異なります。その中に Bunny 型のインスタンス変数が含まれている場合、もちろん機能しません (どのように、決して終わらない再帰的な定義があります)。参照とポインターのみが含まれている場合は、正常に機能するはずです。テンプレートのインスタンス化における Bunny 型は、これに干渉しません。

編集(参照を投稿<>コード編集):

あなたの問題を再現できないようです。私はあなたがやっていることのようなコードを再実装しましたが、私にとってはうまくコンパイルされます:

struct base {
  void fun() {}
};
template < typename T >
struct temp
{
  T * t;

  void f() { ((base*)t)->fun(); }
};

struct test
{
  temp<test> t;

};

int main()
{
  test t;
  t.t.f();
}

未定義の結果が得られるという点で明らかに無効なコードですが、コンパイルは行います。ここでの主な問題は、型 test* から型 base* へのキャストの再解釈です。test が実際に base から継承した場合、キャストは必要ありません。このようなコードは期待どおりに機能しませんが、問題なくコンパイルできるはずです。1 つの推奨事項は、すべての c-style キャストを失うことです。それが何であれ、それはあなたが抱えている問題を解決しません...貼り付けていないコードのどこかになければなりません。

于 2010-06-03T19:06:59.747 に答える
1

Reference<T>タイプ の変数がある場合、 タイプの変数を持つことTTできませんReference<T>。あなたの選択肢は、 を書き換えるか、へのポインタを使用するようにReference<T>書き換えることです:BunnyReference<T>

template<class> class Reference;

class Bunny
{
    ...
private:
    Reference<Bunny>* parent;
}
于 2010-06-03T19:05:13.177 に答える
0

これは、抽象化が問題の解決策となる単なる抽象化の問題ではありませんか? インターフェイスを作成してから、を実装する定義内でIBunny使用することを検討します。Reference<IBunny>IBunny

これは、インターフェイスが考案されたユースケースの 1 つです (典型的な GoF 作成パターンで役立ちます)。

于 2010-06-03T19:17:43.727 に答える