2013-04-11 52 views
0

使用前向聲明時,這些類型的類成員需要是指針。對於將所有類成員聲明爲指針,即使頭文件中的頭文件已包含在這些類中,您怎麼看?這似乎很好一致,沒有混淆。C++ - 類成員作爲指針,即使它可以作爲一個值類型?

+0

請注意,動態創建對象具有性能成本。小的對象,比如struct 2 int,最好保持價值。 – 2013-04-11 13:43:37

回答

0

這是一個壞主意。指針引入一個間接級別,使事情變得繁瑣,不安全(至少如果你不使用智能指針)並且對性能有害。

一般來說,你應該正確地包含頭文件,這樣你就不會遇到這個問題,除非有其他的原因,爲什麼你需要使用指針呢(在相互依賴的情況下,有這個需要,所以它是不可避免地使用它們作爲成員,因此顯然是「好」)。

0

如果您希望forward聲明所有內容(也許是因爲編譯時間縮短)。

也許您應該閱讀約Pimpl idiom。這是你想知道的。

0

假設你有一個A類,像這樣:

class A 
{ 
    public: 
     B  my_b_member; 
}; 

需要這個類B:

class B 
{ 
    public: 
     int my_integer; 
}; 

當然,A類將需要B的全部定義,至少描述B的構造函數的部分。爲什麼?當你聲明你的A類時,它的一個成員(也就是B)也將被實例化,使用它的默認構造函數(沒有參數)。 因此,項目中需要A類的每個類或文件都必須先包含B類定義。

具有A級這樣的,而不是一大優勢:

class A 
{ 
    public: 
     B*  my_b_member; 
}; 

是,你只需要聲明一個B級存在,具有:

class B;

在A的定義之前。

,將需要B的整個定義的唯一一個文件是其中將包含B的類實例化的文件,例如:

int main(void) 
{ 
     A a; 

     a.my_b_member = new B; 
     return 0; 
} 

所以,這取決於你的項目,你正在努力實現,等等等等什麼 我不會說每個班級成員都有爲指針,因爲必須通過分配它們來實例化您的類包含的每個成員,這意味着這些成員將分配在堆上而不是堆棧上。在某些情況下,你不希望發生這種情況:

當你操縱網絡塊時,發送指針是不可能的。