2012-01-17 18 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()’

が表示されます

私は値の初期化などの記事を読んだが、このエラーはまだ私にとって論理的ではないようだ。なぜこれがメンバー機能に影響するのでしょうか?あなたが考えるよう

大幅

+0

このコード例はエラーを再現するのに十分ですか?また、 "MyTestClass mTC;"という行を " "MyTestClass mTC();"それだけでエラーが発生しますか? –

答えて

5
MyTestClass mTC();  

:-)感謝のヘルプは、MyTestClassクラスのオブジェクトを宣言していません。

実際には、mTCという名前で関数を宣言します。この関数はパラメータを取らず、MyTestClassオブジェクトを返します。

これは、C++でMost Vexing Parseとして知られています。

+0

奇妙なことですが、パーサのエラーには誤りがありません。なぜなら、C++では関数内で関数を宣言できないからです。または、関数内で関数を定義することはできませんか? – rubixibuc

+0

@rubixibuc:それはC++の奇妙な暗いコーナーの1つです。あなたがそれに噛まれたときに知っているだけで、それを知っている私の大部分がそれに噛まれていると私に信じています:) –

3

あなたはmost vexing parseを見つけました。

MyTestClass mTC(); 

引数を持たず、MyTestClassのインスタンスを返すmTCという関数の関数プロトタイプとして解析されます。

関連する問題