[英]Overloading () operator in a class with default constructor
我意識到這不一定是你想要做的事情,但是前幾天我遇到了類似的代碼。 所以,我想更多地研究一下這個想法......
我有一個重載了構造函數和仿函數的類。 這按預期工作。 但是,當你使用默認構造函數調用一個類然后嘗試使用該仿函數時,它會失敗(因為它無法弄清楚如何將類轉換為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;
}
令人驚訝的是
foo otherfoo();
聲明一個函數而不是一個對象。 有關討論,請參閱C ++ Gotchas(問題#19:函數/對象歧義) 。
要修復,請將該行更改為
foo otherfoo;
或者,在C ++ 11中,到
foo otherfoo{};
函數聲明和對象定義之間存在着一種矛盾。 它們具有相同的語法。 因此決定將此語法視為函數聲明。 因此在這個聲明中
foo otherfoo();
有一個函數聲明,返回類型為foo,不接受參數。
要使用默認構造函數定義類的對象,同時對其成員進行零初始化,可以使用以下語法
foo otherfoo {};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.