"C++ primer"には、クラスの宣言と定義についてのセクションがあります。私はこの文についてすべてを理解していません。クラスが定義されている場合にのみ、データ型をクラス型にすることができる理由を教えてください。 ( "C++ primer"より)
データメンバは、クラスが定義されている場合にのみクラス型に指定できます。
私はこの文の背後にある論理を理解していません。どのようにデータ型をクラス型に指定するのですか?このアクションは何を意味しますか?
"C++ primer"には、クラスの宣言と定義についてのセクションがあります。私はこの文についてすべてを理解していません。クラスが定義されている場合にのみ、データ型をクラス型にすることができる理由を教えてください。 ( "C++ primer"より)
データメンバは、クラスが定義されている場合にのみクラス型に指定できます。
私はこの文の背後にある論理を理解していません。どのようにデータ型をクラス型に指定するのですか?このアクションは何を意味しますか?
その意味は、クラスタイプT
の非静的クラス・データ・メンバーの宣言のために、T
はcompleteであることが要求されます。
(一般に、
T
のサイズとレイアウトが知られていなければならない場合。)
例えば一方
class foo; // forward declaration
class bar {
foo f; // error; foo is incomplete
};
内蔵型とは対照的に、
class foo {}; // definition
class bar {
foo f; // fine; foo is complete
};
私は、これはコンパイルすることを意味します信じている:
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!
};
あなたは、A. –
またはBの角かっこの間に何も必要ありません。コメントは常にオプションですが、読者があなたが何かを置くことを意味するとは思っていないが、忘れてしまったように、このケースでは良い練習です。 –
私は、クラスターだけでなく、クラス全体を意味していました。この答えが意味をなさないためには、Bに_something_が必要です。具体的にはタイプAのフィールドですが、Aの中には何も必要ありません。また、元のコメントは明確ではありませんが、コメントは数えませんでした。私はあなたが実際のコードを必要としないことを意味しました。 –
それは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;
};
クラスタイプは、 '' class'又はstruct'で表されるタイプです。文は、そのクラスが定義されている場合(すなわち、前方宣言されているだけではない)にのみ、メンバーがクラス型であることを意味する。しかし、不完全な型へのポインタや参照を持つことはできます。 –