2016-04-26 16 views
0

私は基本的に、関数がオブジェクトオブジェクトを使用し、オブジェクトが上記関数を使用する循環依存関係の問題があります。この問題を回避する方法はありますか?私はこの例を理解関数はオブジェクトとオブジェクトを使用して関数を使用します

//function that uses struct 
void change_weight(Potato* potato,float byX) { potato->weight+=byX; } 
//said struct that uses said function 
struct Potato 
{ 
    float weight=0.0; 
    Potato(float weightin) { change_weight(weightin); } 
}; 

注意愚かであるが、この例では唯一、私は時々、私はそれを回避するか、だろうか分からないでしょうはるかに複雑な状況に来ている「問題の本質」が含まれていたとえそれが働くことができたとしても、それを行うことができれば非常に便利です。私はこれを行う方法がある場合はなしで尋ねています。

のみ 宣言構造定義でコンストラクタ、構造の外に定義を移動し、一緒に機能し、それを置き、 以下の構造定義
+2

通常の.hと.cppファイルの間の宣言と実装。 – Quentin

+0

コードは単なる例に過ぎませんが、かなり悪いです。:)関数はメンバー関数としてうまく適合します。 –

+0

@JoachimPileborg答え: "この例はばかげているが、この例では、問題の本質が含まれているだけで、時には私がそれを回避する方法がわからない、もっと複雑な状況になっていることに注意してくださいまたはそれが " –

答えて

3

:あなたはちょうど分割する必要があり

struct Potato 
{ 
    float weight=0.0; 
    Potato(float weightin); // Only declare constructor 
} 

//function that uses struct 
void change_weight(Potato potato,float byX) { potato.weight+=byX; } 

// Define the constructor 
Potato::Potato(float weightin) { change_weight(*this, weightin); } 
+2

の周りで働くことができたとしても質問に答えますが、コードがコンパイルされないことに注意してください:' change_weight 'の呼び出しにパラメータがありません。さらに、「ジャガイモ」は価値によって渡されます。 – Quentin

+0

@Quentin最後にセミコロンを追加するように編集し、私の質問とこの回答の両方で参照渡しに値渡しのパスを変更しました(私はIdeone [here](http://ideone.com/rdCMO5)でテストしました) )) –

関連する問題