2012-02-15 190 views
19

我想为其中一个成员函数可选参数。当没有提供参数时,它将使用成员变量。如何在C++中使用成员变量作为默认参数?

然而,当我试图编译它,它显示“错误:无效使用非静态数据成员的对象:: initPos“的”

只是为了隔离问题,我试着违约int类型它编译得很好。 我想知道我的代码有什么问题,以及如何使用成员函数作为默认值。

谢谢你的帮助!

Object.h

class Object 
{ 
    public: 
     ... 
     void MoveTo(double speed, Point position); 

    protected: 
     Point initPos; 
     Point currPos; 

}; 

Object.c

void Object::MoveTo(double speed, Point position = initPos) 
{ 
    currPos = postion; 
} 

Point.h

class Point 
{ 
    ... 

    private: 
     double x; 
     double y; 
     double z; 
}; 
+1

你的问题让我这个产卵一个:http://stackoverflow.com/questions/9286801/valid-expressions-for-default-function-arguments – 2012-02-15 01:42:56

回答

30

成员函数的默认参数表达式只能依赖于类或全局作用域中的东西。缺省参数也必须在方法声明中指定(即在头文件中)。

为了解决这个问题,需要2个重载的MoveTo方法。一个需要1个参数,另一个需要2个参数。采用1个参数的方法调用另一个方法,传递您认为是默认值的值。

void Object::MoveTo(double speed) 
{ 
    MoveTo(speed, initPos); 
} 

void Object::MoveTo(double speed, Point position) 
{ 
    // Everything is done here. 
} 

注意,当你MoveTo(double)电话MoveTo(double, Point),它可以让你写的MoveTo实施只有一次,从而尊重DRY原则。

+0

谢谢!我知道我可以这样做。我只是想知道是否有一个更短的方法来做到这一点,比如将其作为默认参数。但我想这将是唯一的方法来做到这一点。 – tuzzer 2012-02-15 01:14:26

+0

那么,如果,而不是只有一个可选参数,我有很多呢? 说 void Object :: MoveTo(double speed,Point position = initPos,Point a = m_a,Point b = m_b,Point c = m_c) 那么我不需要做许多函数? – tuzzer 2012-02-15 01:17:05

+0

@MatthewChan:不幸的是,是的。不要传递许多参数,也许可以更改设计,以便用户传递一个对象。这个对象已经包含了合理的默认值,用户只能改变那些需要不同的值。如果你决定这样做,你可能会对Method Chaining idiom感兴趣,使设置多个参数更简洁(http://en.wikipedia.org/wiki/Method_chaining)。 – 2012-02-15 01:27:16

10

默认值是不是该原型的部分,即他们被解决调用者,而不是由函数本身。所以首先,他们必须对呼叫者可见。其次,他们无法访问班级的受保护成员。 (我很确定你甚至不能使用公共成员作为默认值,但我太累了无法检查。)

要解决此问题,请按照其他答案中的建议使用链式重载。

+0

谢谢。我尝试将initPos更改为public,但正如您所说,它仍然无法正常工作。 因此,我们只能使用常量作为默认参数(如不是成员函数,可以输出的东西)? – tuzzer 2012-02-15 01:10:55

1

可以重载你的函数成员那样:

void Object::MoveTo(double speed, Point position) { 
    .... 
} 

void Object::MoveTo(double speed) { 
    Point position = this->initPos; 

    MoveTo(speed, position); 
} 
+0

不幸的是唯一的工作可以完成工作,看起来很丑,但:( – Argento 2017-12-08 22:30:01

相关问题