2016-08-13 27 views
0

私は現在、fooとbarの2つのクラスを持っています。 Fooはそのメソッドの1つでbarのインスタンスを使用し、barはそのコンストラクタでfooのインスタンスを使用します。しかし、これはコンパイルされません。私は循環依存があることを理解しているので、fooのメソッドがヘッダファイルで宣言される前に、fooの内側のbarを宣言することでこれを打ち破ろうとしました。これはソースファイルのfooのメソッドでバーやコンポーネントを実際に使用できないために失敗しました。私はその後、バーを必要とするソースファイルのすべてが既に定義されているように並べ替えを試みました。次にbarのすべての定義を入れてから、バーを使用するfooのメソッドを定義しました。それは同じ理由で失敗しました。私は私がfoo ::メソッドの定義では、バーのインスタンスへの参照を削除すると、コードがコンパイルされ、正常に実行されることを指摘したいと思いC++のクラス定義における循環依存関係の回避

// Header.h 
class foo{ 
    class bar; 

    void method(bar& b); 
}; 

class bar{ 
    bar(foo& f, double d); 
}; 

// Source.cpp 
#include Header.h 
// stuff defining foo that I need for bar in the form foo::foo(...){...} 

// stuff defining bar that I need for foo::method 

void foo::method(bar& b){ 
    // do stuff with foo and b 
} 

:ここでは、これまで私のコードの簡易版です。

私の具体的な例では、fooクラスが均質座標のベクトルとして、barクラスが四元数として使用されています。クォータニオンクラスは、そのコンストラクタでベクトルと回転角を使用し、ベクトルクラスはその回転メソッドで四元数を使用します。

依存関係を削除せずにこれをコーディングする方法はありますか?依存関係の1つを削除するだけですか?

+0

'foo'の前に' bar'を宣言するとコードが正常に動作するはずです。(内ではありません) – vu1p3n0x

答えて

1

fooの外barを宣言前進してみてください。

class bar; 

class foo{ 
    method(bar& b); 
} 

class bar{ 
    bar(foo& f, double d); 
} 

あなたがそこにそれを持っていたとして、あなたはfoo::barというクラスを前方に宣言されました。

+0

'foo :: method'も戻り値の型を使用できます。 – user4581301

+0

そして、クラスの最後にセミコロンがありません。私は気づいていませんでした。すべてがプライベートだとは言えません...私は彼がちょうどそこに簡単なデモコードを書いたと思います。 – MondKin

+0

@Mondkinこれは完全に機能しました。 barがfooのサブクラスであった場合、これも機能しますか? – AlgorithmsX

関連する問題