2011-10-23 2 views
3

私はタイトルに目標を記述するために全力を試してみましたが、ここではコードである:クラスBのインスタンスを含む構造体Aを宣言する方法。クラスBは構造体Aを返す関数を持っていますか?

struct Bar { 
    Foo one; 
    Foo two; 
} 

class Foo { 
    Bar function(); 
} 

私は、これは動作しません知っているが、どのように私はアイデアを実現するのでしょうか?構造体をグローバルにしたいのは、main.cppでも使われているからです。私はすでにクラス内の構造体を宣言しようとした後、Foo :: Bar {}のようにクラス外の構造体を定義していますが、どちらも機能しません。

私がこれをやりたい理由は、商と剰余の両方を返す除算関数など、複数の変数を返す関数があるためです。しかし、問題は、カスタムクラス(BigInteger)の複数のインスタンスが返されていることです。

答えて

4

BarにはFooのインスタンスが含まれているため、前者の宣言では後者を不完全にすることはできません。したがって、Barを宣言する前にFooを宣言する必要があります。ただし、FooにはBarオブジェクトを返す関数が含まれているので、Fooを宣言する前にBarを宣言して転送する必要があります。

struct Bar; 

class Foo { 
    Bar function(); 
}; 

struct Bar { 
    Foo one; 
    Foo two; 
}; 

Bar Foo::function() 
{ 
    return Bar(); 
} 

機能がBarオブジェクトをインスタンス化する必要があるのでFoo::functionの実際の定義は唯一Barの宣言の後に現れることに注意してください。

+0

あなたはクラスバーを意図しましたか?構造体バーにする;そして、はい、これはすべてヘッダーファイル内にあるので、すべての実装は後であります。 – Sooie

+0

@Sooieはい、私はしました、申し訳ありません。私はそれを修正しました。 – Praetorian

4

あなたは、このようなクラスの転送を実行する必要があります。

class Foo; 


struct Bar { 
    Foo *one; 
    Foo *two; 
}; 

class Foo { 
    struct Bar function(); 
}; 

これは実際には使用可能作るので、それを定義せずにクラスを宣言します。

+0

これは機能しません。まず最初に 'foo'!=' Foo'; C++は大文字と小文字を区別しますまた、 'Bar'はポインタやインスタンスへの参照ではなく' Foo'のインスタンスを含んでいるので、 'Foo'型は' Bar'の宣言では完全ではありません。 – Praetorian

+0

これを試してみると、 フィールド 'one'には不完全な型があります。 フィールド 'two'には不完全な型があります(編集:Praetorianが言ったこと) – Sooie

+0

ああ@Praetorian、それをキャッチしてくれてありがとう。私はそれを修正しました。 Sooie私の修正を見てください。 –

関連する問題