2014-03-19 103 views
5

我有點糊塗了......關於C++類具有自我參考

這是爲什麼允許在C++:

static int t = 0; 

class A 
{ 
    public: 
     A() : m(t++) 
     { 

      cout << "C:" << m << endl; 
      if(t >= 5) 
      { 
       A a;      // <<<< ----- THIS line 
       throw(a); 
      } 
     }    

     int m; 
}; 

但是,這並不:

static int t = 0; 

class A 
{ 
    public: 

     A() : m(t++) 
     { 

      cout << "C:" << m << endl; 
     } 

     A a;       // <<<< ----- THIS line 

     int m; 
}; 

第二個沒有按預期編譯(是的,我知道爲什麼它不編譯:在代碼A仍然不完整)...

但是......第一個很好地編譯(並且完成它應該做的事情,例如:在諸如A a[10];之類的語句上崩潰應用程序)。 A是構造函數中的完整類型嗎?對於這種情況,我也可以指出一些C++標準條目嗎?

+0

除了一個事實,即這個類型是不完整的,如果你被允許該成員,那麼A的大小將是無限的,並且構建將永遠不會返回。 – molbdnilo

回答

3

也可以指出我對這種情況的一些C++標準條目?

是的,draft C++ standard說一類不完全直至收盤}定義,這是在部分9.2類成員段落:

一類被認爲是一個完全限定對象類型(3.9)(或完整類型)在classspecifier的結束處}。 [...]

和類的所有非靜態數據成員必須是完整的,從第:

非靜態(9.4)數據成員不得有不完全類型。特別是,C類不得包含C類的非靜態成員,但它可以包含指向C類對象的指針或引用。

但在構造函數中它也被認爲是完全的:

[...]在類成員規範,類被認爲是完整的函數體,默認參數,內[...]

雖然靜態成員可以不完整,部分9.4.2靜態數據成員段落:

在其類定義的靜態數據成員的聲明是不是定義,並且可以比CV-合格空隙以外的不完全型的[...。]

這也是情理之中的不允許類以自身,因爲這需要無限的空間,因爲自參考永遠不會結束,A包含A包含A ...

+0

是的!正是我所期待的關於類的「完整性」:)謝謝! – fritzone

5

當你聲明任何變量時,編譯器應該知道它的大小。如果您的第二個示例是在A內部創建A的對象,則編譯器將無法計算分配內存的大小A