2016-08-17 6 views
0

私はこのようなクラスの何かを持っている:無効使用

class Foo : public Bar { 
double v1; 
double v2; 
... 
public: 
explicit Foo (double v1_ = 1.0, double v2_ = v1 > 0.0 ? 2.0 : 0.0) 
    : v1(v1_), v2(v2_) 
{ 
    // do something 
} 

// do other things 

}; 

を私はそうのように、次のコンパイルエラーが表示されます。

error: invalid use of non-static data member Foo::v1 
note: declared here 
double v1; 
    ^

任意の提案をに感謝していますこのエラーを回避してください。また、私のコードの間違いを指摘し、少し説明して私がよりよく理解できるようにしてください。前もって感謝します。

答えて

1
explicit Foo (double v1_ = 1.0, double v2_ = v1 > 0.0 ? 2.0 : 0.0) 
              ^^ 

v1を使用する時点ではまだ存在しません。

残念ながら、この時点でv1_を使用することはできません。あなたの代わりに何ができるか、2つのバージョンのコンストラクタを分割することです:

// for two arguments 
Foo (double v1_, double v2_) 
    : v1(v1_), v2(v2_) 
{ 
    // do something 
} 

// for zero or one argument 
explicit Foo (double v1_ = 1.0) 
    : Foo(v1_, v1_ > 0.0 ? 2.0 : 0.0) 
{ 
} 

あなたはコンストラクタを呼び出すと(ここでは、私はコンストラクタがコードの重複を避けるために備わっ委任使用)

+0

これでv1_が使用されるはずですが、このスコープでv1_が宣言されていないという別のエラーが発生します。 – Duh

+0

はい、簡単なものに応じて、デフォルトの引数を1つ作ることはできません。 2つの別々のコンストラクタを使う方がよいでしょう。 –

+0

@ MarkXLII更新された回答を参照してください。 –

0

オブジェクトはそう存在しません。 。それを作成して返すコンストラクタです。したがって、コンストラクタの引数にはv1を参照することはできません。オブジェクトはまだありませんし、v1もありません。

+0

私のコメントを上からコピーする - さて、おそらく私はそこにv1_を使用するべきですが、それはv1_がこのスコープで宣言されていないことを示す別のエラーを与えます。私はv1でその状態をチェックする必要があります。このような状況では、何が代わりのアプローチになるべきですか? – Duh

+0

v2にデフォルト値を指定しないで、コンストラクタの本体で代入とロジックを行うだけです。 –

関連する問題