2017-11-22 21 views
0

私はクラスのプロトタイプを作成しようとしていますが、「aClass」は未定義のクラス「myClass」を使用していますC++クラスのプロトタイプが正しく機能していませんか?

私はプロトタイプを正しく作っていると確信しています。プロトタイプ関数を使用すると動作しますが、クラスプロトタイプは動作しません。

extern class myClass;    // prototypes 
extern void myFunction(); 

int main()       // main 
{ 
    myClass aClass; 
    myFunction(); 
    return 0; 
} 

class myClass {      // this doesn't work 
public: 
    void doSomething() { 
     return; 
    } 

    myClass() {}; 
}; 
void myFunction() {     // this works 
    return; 
} 
+4

「extern class myClass;」は意味をなさない。コンパイラはすでにあなたに言ったでしょう。 – user0042

+0

@ user0042それでは、myClassではなくmyFunctionと一緒に動作するのはなぜですか? – razorozx

+4

違いますので –

答えて

6

myClass aClass;complete typeことがmyClassを必要とする定義です。その時点でコンパイル時にmyClassのサイズとレイアウトを知っている必要があります。

Any of the following contexts requires class T to be complete:

  • ...
  • definition of an object of type T;
  • ...

つまり、その前にクラスを定義する必要があります。

前方宣言は、型の完了を必要としないケースで有効です。型へのポインタの定義(myClass* p;など)。

機能については、ストーリーが異なります。関数呼び出しが行われた場合、関数はodr-usedです。その定義はどこかに存在しなければなりません。定義はコンパイル時には必要ではなく、main()(前の宣言を含む)の後に定義することは問題ありません。

a function is odr-used if a function call to it is made or its address is taken. If an object or a function is odr-used, its definition must exist somewhere in the program; a violation of that is a link-time error.


ところで:クラスの前方宣言でexternを使用することは不必要です。

+2

クラスはmain()の前に一度しか定義されていないので、クラスプロトタイプを持つことはできません。それは私がここで読んでいるものですか? – razorozx

+2

@razorozxこの場合、yes、 'myClass'は' main() 'の前に定義しなければなりません。答えに追加された追加情報も参照してください。 – songyuanyao

関連する問題