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

7

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

以下是代码:

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_;
    ^

这表明成员变量必须是静态的才能在函数中用作默认参数。但我不想让它们是静态的...那么有什么解决方法呢?

1
是的,它们必须是静态的,请参见为什么允许这些默认参数? - Shafik Yaghmour
2个回答

9

过载 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_);
}

你尝试解决的现实问题,与原先加两个数字的问题相比,更有可能从这种重构中受益。这种行为更明显地与你希望通过默认参数实现的行为相同。

4
在其他版本中,我会调用Bar(int, int)以将代码因式分解(我的意思是int Bar() { return Bar(_x, _y); })。 - Jarod42

5
一个解决方法是重载你的Bar函数,如下:
int Bar()
{
    return x_ + y_;
}
int Bar(int a)
{
    return a + y_;
}
int Bar(int a, int b)
{
    return a + b;
}

4
在另一个版本中,我会调用 Bar(int, int) 来因式分解代码(我的意思是 int Bar() { return Bar(_x, _y); })。 - Jarod42
@Jarod42 很好的观点。我认为你的表达方式更加优雅。 - Logicrat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接