可能重复:
Nonstatic member as a default argument of a nonstatic member function
确定。所以我在理解如何完成看似简单的任务时遇到了问题......这就是我想要完成的事情:
#include <iostream>
using namespace std;
class A{
private:
int _x;
public:
A(int x){
_x = x;
}
void test(int x=_x){
cout << x << endl;
}
};
int main(){
A a(3);
a.test();
}
编译器抱怨int x=_x
部分说error: invalid use of non-static data member A::_x
那么如何使用这样的默认参数?
感谢。
答案 0 :(得分:13)
你做不到。
但是test
的重载可能没有参数。
void test(){
test(_x);
}
答案 1 :(得分:3)
你做不到。但是,如果将_x
声明为静态数据成员:
static int _x; //_x is static data member now!
然后你可以这样做,即你可以使用_x
作为你的成员函数中参数的默认值。
C ++标准本身的一个很好的例子。引自第8.3.6 / 9节:
同样,非静态成员也应如此 不能在默认参数中使用 表达,即使不是 评估,除非它看起来像 类成员访问的id-expression 表达式(5.2.5)或除非 用于形成指向成员的指针 (5.3.1)。 [例子:宣言 以下示例中的X :: mem1()是 形象不对,因为没有对象 提供给非静态成员X :: a 用作初始化器。
int b;
class X {
int a;
int mem1(int i = a); // error: nonstatic member a used as default argument
int mem2(int i = b); // OK; use X::b
static int b;
};
X :: mem2()的声明是 但是,因为没有任何对象, 需要访问静态成员 X :: B
希望它有所帮助。
答案 2 :(得分:0)
你的功能是否有一个哨兵(-1)?
void test(int x=-1)
{
if(x == -1)
x = _x;
//Rest of code
}
你也可以使用:
void test(int x, bool bUseLocal=false)
{
if(bUseLocal)
x = _x;
//Rest of code
}