2012-01-17 81 views
0

這裏是我的代碼構造對象和調用成員函數

#include <iostream> 

using namespace std; 

class MyTestClass 
{ 
    int MyTestIVar; 

    public: 
     MyTestClass(void); 
     int firstCallMethod(void); 
     int secondCallMethod(void); 
}; 

MyTestClass::MyTestClass(void) 
{ 
    MyTestIVar = 4; 
} 
int MyTestClass::firstCallMethod(void) 
{ 
    return secondCallMethod(); 
} 
int MyTestClass::secondCallMethod(void) 
{ 
    return MyTestIVar; 
} 

int main(int argc, char *argv[]) 
{ 
    MyTestClass mTC; 
    cout << mTC.firstCallMethod() << endl; 
    return 0; 
} 

如果使用使用

MyTestClass mTC(); 

而是將不允許我打電話給任何成員函數,並顯示此錯誤

./experiment.cpp: In function ‘int main(int, char**)’: ./experiment.cpp:31:14: error: request for member ‘firstCallMethod’ in ‘mTC’, which is of non-class type ‘MyTestClass()’

我讀了關於value-initialize等的帖子,但是這個錯誤對我來說依然不合邏輯。爲什麼會影響會員功能?

和幫助非常感謝:-)

+0

你確定這個代碼示例是否足以重現錯誤?你是否也意味着如果你將行「MyTestClass mTC;」與「MyTestClass mTC();」只有那麼錯誤發生? – 2012-01-17 10:06:02

回答

5
MyTestClass mTC();  

沒有聲明MyTestClass類的對象,因爲你的想法。

它實際上,通過名稱mTC聲明一個函數,它不接受任何參數並返回一個MyTestClass對象。

這就是所謂的Most Vexing Parse在C++中。

+0

奇怪,是不是解析器錯誤的錯誤,雖然因爲在C++中,你不能在函數內聲明函數?或者只是你不能在一個函數中定義一個函數? – rubixibuc 2012-01-17 10:09:12

+0

@rubixibuc:這是C++奇怪的黑暗角落之一,當你被它咬住時,你纔會知道它,並且相信我大部分知道它被它咬過的人:) – 2012-01-17 10:13:28

3

你偶然發現了most vexing parse

MyTestClass mTC(); 

被解析爲一個名爲mTC函數不具有任何參數和返回的MyTestClass一個實例的一個功能的原型。