具有默认构造函数的类中的重载()运算符

时间:2014-02-24 19:49:58

标签: c++

我意识到这不一定是你想要做的事情,但是前几天我遇到了类似的代码。所以,我想更多地研究一下这个想法......

我有一个重载了构造函数和仿函数的类。这按预期工作。但是,当你使用默认构造函数调用一个类然后尝试使用该仿函数时,它会失败(因为它无法弄清楚如何将类转换为int,这不是我想要的,无论如何。)这样做的正确方法是什么?

#include <cstdio>

class foo
{
public:
    foo(int a, int b);
    foo();
    int operator()();
private:
    int result;
};

foo::foo(int a, int b)
{
    printf("I am a foo(int, int). a: %d b: %d\n", a, b);
    result = a + b;
}

foo::foo()
{
    printf("I am a base foo!\n");
    result = -1;
}

int foo::operator()()
{
    return result;
}

int main(void)
{
    int ret1 = -12345;
    int ret2 = -12345;

    foo myfoo(3, 8);
    foo otherfoo();

    ret1 = myfoo();
    ret2 = otherfoo(); //fails. Also, otherfoo()() fails.

    printf("foo: %d otherfoo: %d\n", ret1, ret2);

return 0;
}

2 个答案:

答案 0 :(得分:8)

令人惊讶的是,

foo otherfoo();

声明一个函数而不是一个对象。有关讨论,请参阅C++ Gotchas (Gotcha #19: Function/Object Ambiguity)

要修复,请将该行更改为

foo otherfoo;

或者,在C ++ 11中,

foo otherfoo{};

答案 1 :(得分:0)

函数声明和对象定义之间存在着一种矛盾。它们具有相同的语法。因此决定将此语法视为函数声明。因此在本声明中

foo otherfoo();

有一个函数声明,返回类型为foo,不接受参数。

要使用默认构造函数定义类的对象,同时对其成员进行零初始化,可以使用以下语法

foo otherfoo {};