默认参数为非静态成员变量

Default arguments as non-static member variables

本文关键字:静态成员 变量 参数 默认      更新时间:2023-10-16

我想创建一个类,它有两个整数成员变量,和一个函数,它有两个可选参数。如果提供了这些参数,则函数返回它们的总和;如果没有提供这些参数,则函数返回两个成员变量的和。

代码如下:

class Foo
{
private:
    int x_;
    int y_;
public:
    Foo(int x, int y) : x_(x), y_(y){}
    int Bar(int a = x_, int b = y_)
    {
        int z = a + b;
        return z;
    }
};
但是,我得到以下编译错误:
invalid use of non-static data member 'Foo::x_'
int x_;
    ^
invalid use of non-static data member 'Foo::y_'
int y_;
    ^

这表明成员变量必须是静态的才能在函数中作为默认实参使用。但是我不希望它们是静态的……

解决方案是什么?

超载Bar:

int Bar()
{
    return x_ + y_;
}
int Bar(int x)
{
    return x + y_;
}
int Bar(int x, int y)
{
    return x + y;
}

感谢@Jarod42的改进:

int Bar(int a, int b)
{
    return a + b;
}
int Bar(int a)
{
    return Bar(a, y_);
}
int Bar()
{
    return Bar(x_, y_);
}

您试图解决的实际问题更有可能从重构中受益,而不是最初的两个数字求和问题。这种行为显然与您希望通过默认参数实现的行为相同。

一种解决方法是将Bar函数重载为:

int Bar()
{
    return x_ + y_;
}
int Bar(int a)
{
    return a + y_;
}
int Bar(int a, int b)
{
    return a + b;
}