2016-08-17 60 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_。你可以做什麼,而不是,有兩個版本分裂的構造:

// 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

是的,你不能根據其他簡單的方法創建一個默認參數。你最好用兩個獨立的構造函數。 –

+0

@MarkXLII查看最新的答案。 –

0

當你調用構造函數的對象不存在,是。它是創建並返回它的構造函數。所以你不能在構造函數的參數中引用v1 - 仍然沒有對象,也沒有v1。

+0

從上面複製我的評論 - 好的,所以我應該使用v1_,但是會給出不同的錯誤,說明v1_未在此範圍內聲明。我碰巧需要在v1上檢查這個條件。在這種情況下應該採取哪種替代方法? – Duh

+0

不要爲v2提供默認值,而只需在構造函數的主體中執行賦值和邏輯。 –