2017-02-06 37 views
4

在「C++ primer」一書中,有關於類聲明和定義的章節。我不明白這句話的所有內容:爲什麼只有在定義了類時才能將數據成員指定爲類類型? (來自「C++ primer」一書)

只有在類已定義的情況下,才能將數據成員指定爲類類型。

我不明白這句話背後的邏輯。如何將數據成員指定爲類類型,此操作是什麼意思?

+1

類類型是由一個'class'或'struct'表示的類型,而不是內置型。這句話意味着只有在類已經被定義的情況下,成員纔可以是類類型的,即不僅僅是前向聲明。但是,您可以擁有指向不完整類型的指針或引用。 –

回答

8

這意味着,對於類型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 
}; 
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

我的意思是全班的A,而不僅僅是Ctor。爲了使這個答案有意義,你需要B中的_something_;具體而言,是一個A類型的字段,但是A內部不需要任何東西。另外,我不計算評論,儘管我原來的評論並不明確。我的意思是你不需要任何實際的代碼。 –

2

這意味着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; 
}; 
相關問題