2016-08-17 61 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提供默认值,而只需在构造函数的主体中执行赋值和逻辑。 –