在「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的括號之間的任何東西。評論總是可選的,但在這種情況下,這是一個很好的做法,這樣讀者就不會認爲你想把東西放在那裏,但忘記了。 –
我的意思是全班的A,而不僅僅是Ctor。爲了使這個答案有意義,你需要B中的_something_;具體而言,是一個A類型的字段,但是A內部不需要任何東西。另外,我不計算評論,儘管我原來的評論並不明確。我的意思是你不需要任何實際的代碼。 –
這意味着member
本規範是無效的,因爲A
聲明但沒有定義:
class A;
class B {
A member;
};
爲什麼不允許這樣做的一個原因是因爲se sizeof(A)
是未知的。
然而,這是有效的,因爲A
定義:
class A {
int value;
};
class B {
A member;
};
這是合法的,即使A
沒有定義(僅申報),因爲member
不是類類型的,但是指針類型:
class B {
A* member;
};
類類型是由一個'class'或'struct'表示的類型,而不是內置型。這句話意味着只有在類已經被定義的情況下,成員纔可以是類類型的,即不僅僅是前向聲明。但是,您可以擁有指向不完整類型的指針或引用。 –