2017-02-06 5 views
4

"C++ primer"には、クラスの宣言と定義についてのセクションがあります。私はこの文についてすべてを理解していません。クラスが定義されている場合にのみ、データ型をクラス型にすることができる理由を教えてください。 ( "C++ primer"より)

データメンバは、クラスが定義されている場合にのみクラス型に指定できます。

私はこの文の背後にある論理を理解していません。どのようにデータ型をクラス型に指定するのですか?このアクションは何を意味しますか?

+1

クラスタイプは、 '' class'又はstruct'で表されるタイプです。文は、そのクラスが定義されている場合(すなわち、前方宣言されているだけではない)にのみ、メンバーがクラス型であることを意味する。しかし、不完全な型へのポインタや参照を持つことはできます。 –

答えて

8

その意味は、クラスタイプTの非静的クラス・データ・メンバーの宣言のために、Tcompleteであることが要求されます。

(一般に、Tのサイズとレイアウトが知られていなければならない場合。)

例えば一方

class foo; // forward declaration 
class bar { 
    foo f; // error; foo is incomplete 
}; 

内蔵型とは対照的に、

class foo {}; // definition 
class bar { 
    foo f; // fine; foo is complete 
}; 
3

私は、これはコンパイルすることを意味します信じている:

class A 
{ 
public: 
    A() {/* empty */} 
}; 

class B 
{ 
public: 
    B() {/* empty */} 

private: 
    A myClassMember; // ok 
}; 

を....しかし、これはしません:

class A; // forward declaration only! 

class B 
{ 
public: 
    B() {/* empty */} 

private: 
    A myClassMember; // error, class A has only been declared, not defined! 
}; 
+0

あなたは、A. –

+0

またはBの角かっこの間に何も必要ありません。コメントは常にオプションですが、読者があなたが何かを置くことを意味するとは思っていないが、忘れてしまったように、このケースでは良い練習です。 –

+0

私は、クラスターだけでなく、クラス全体を意味していました。この答えが意味をなさないためには、Bに_something_が必要です。具体的にはタイプAのフィールドですが、Aの中には何も必要ありません。また、元のコメントは明確ではありませんが、コメントは数えませんでした。私はあなたが実際のコードを必要としないことを意味しました。 –

2

それはAが宣言されているためmemberのこの仕様は、有効ではありません意味しかし定義されていません:

class A; 

class B { 
    A member; 
}; 

これが許可されない理由の1つは、 se sizeof(A)は不明です。

class A { 
    int value; 
}; 

class B { 
    A member; 
}; 

そして、これはmemberは、クラス型が、ポインタ型ではないのでAは、(のみ宣言)定義されていない場合でも有効です:Aが定義されているので、

しかし、これは有効です。

class B { 
    A* member; 
}; 
関連する問題