2014-02-24 110 views
2

我意識到這不一定是您想要做的事情,但我碰到類似於前一天的某些代碼。所以,我想看看更多的想法...使用默認構造函數在類中重載()運算符

我有一個類已經重載了一個構造函數和一個仿函數。這按預期工作。然而,當你用默認的構造函數調用一個類,然後嘗試使用函子時,它會失敗(因爲它無法弄清楚如何將類轉換爲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; 
} 

回答

8

令人驚訝地,

foo otherfoo(); 

聲明的函數,而不是一個對象。討論請參閱C++ Gotchas (Gotcha #19: Function/Object Ambiguity)

要修正,該行更改爲

foo otherfoo; 

,或者在C++ 11,以

foo otherfoo{}; 
+2

或'FOO otherfoo {};'在C++ 11 – Brian

+0

謝謝@BrianBi。我已經添加了答案。 – NPE

+1

NPE,該鏈接非常非常容易受到鏈接腐爛。關於[C++最令人頭疼的解析]已經有很多關於SO的很好的討論(http://stackoverflow.com/questions/16588750/cs-most-vexing-parse-again)。 –

0

有函數聲明和對象定義之間的ambiguiuty。他們有相同的語法。所以決定把這個語法看作一個函數聲明。因此在這個聲明中

foo otherfoo(); 

有一個函數聲明具有返回類型foo並且不接受參數。

要使用默認構造定義一個類的一個對象,並在同一時間零初始化它的成員可以使用以下語法

foo otherfoo {};