如何在C++中使用成员变量作为默认参数?

tuz*_*zer 33 c++ arguments default object

我想为其中一个成员函数选择一个参数.如果没有提供参数,它将使用成员变量.

但是,当我尝试编译它时,它显示" 错误:无效使用非静态数据成员'Object :: initPos' "

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

谢谢您的帮助!

Object.h

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

    protected:
       Point initPos; 
       Point currPos;

};
Run Code Online (Sandbox Code Playgroud)

Object.c

void Object::MoveTo(double speed, Point position = initPos)
{
    currPos = postion;
}
Run Code Online (Sandbox Code Playgroud)

Point.h

class Point
{
    ...

    private:
       double x;
       double y;
       double z; 
};
Run Code Online (Sandbox Code Playgroud)

Emi*_*ier 44

成员函数的默认参数表达式只能依赖于类或全局范围内的事物.默认参数也必须在方法的声明中指定(即在头文件中).

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

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

void Object::MoveTo(double speed, Point position)
{
    // Everything is done here.
}
Run Code Online (Sandbox Code Playgroud)

请注意,当您进行MoveTo(double)调用时MoveTo(double, Point),它允许您只编写MoveTo一次执行,从而遵守DRY原则.

  • 谢谢!我确实知道我可以这样做。我只是想知道是否有更短的方法来做到这一点,例如将其设为默认参数。但我想这是唯一的方法。 (2认同)

Oli*_*rth 13

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

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

  • ```它们是由调用者解决的,而不是由函数本身解析```:我明白了,这就是原因。 (4认同)
  • @Oliver那么为什么允许静态数据成员作为默认值?它们并不比其他数据成员更可见(因为调用成员函数时该对象将存在)。或者如果静态成员是私有的怎么办? (2认同)

dam*_*son 5

您可以像这样重载您的函数成员:

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

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

   MoveTo(speed, position);
}
Run Code Online (Sandbox Code Playgroud)