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

新手上路,请多包涵

我想为其中一个成员函数提供一个可选参数。当没有提供参数时,它将使用成员变量。

但是,当我尝试编译它时,它显示

error: invalid use of non-static data member 'Object::initPos'

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

谢谢您的帮助!

对象.h

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

    protected:
       Point initPos;
       Point currPos;

};

对象.c

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

点.h

 class Point
{
    ...

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

原文由 tuzzer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 653
2 个回答

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

为了解决这个问题,您需要 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 原则。

原文由 Emile Cormier 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Oliver Charlesworth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题