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

Max*_*cat 2 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;
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 8

令人惊讶的是

foo otherfoo();
Run Code Online (Sandbox Code Playgroud)

声明一个函数而不是一个对象.有关讨论,请参阅C++ Gotchas(问题#19:函数/对象歧义).

要修复,请将该行更改为

foo otherfoo;
Run Code Online (Sandbox Code Playgroud)

或者,在C++ 11中,到

foo otherfoo{};
Run Code Online (Sandbox Code Playgroud)

  • 或者在C++ 11中``foo otherfoo {};` (2认同)