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原则.
Oli*_*rth 13
默认值不是原型的一部分,即它们由调用者解决,而不是由函数本身解决.首先,它们必须对呼叫者可见.其次,他们无法访问该类的受保护成员.(我很确定你甚至不能使用公共成员作为默认值,但我太累了,无法检查.)
要解决此问题,请使用其他答案中建议的链式重载.
您可以像这样重载您的函数成员:
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)
归档时间: |
|
查看次数: |
15722 次 |
最近记录: |