使用前向聲明時,這些類型的類成員需要是指針。對於將所有類成員聲明爲指針,即使頭文件中的頭文件已包含在這些類中,您怎麼看?這似乎很好一致,沒有混淆。C++ - 類成員作爲指針,即使它可以作爲一個值類型?
0
A
回答
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;
}
所以,這取決於你的項目,你正在努力實現,等等等等什麼 我不會說每個班級成員都有爲指針,因爲必須通過分配它們來實例化您的類包含的每個成員,這意味着這些成員將分配在堆上而不是堆棧上。在某些情況下,你不希望發生這種情況:
當你操縱網絡塊時,發送指針是不可能的。
請注意,動態創建對象具有性能成本。小的對象,比如struct 2 int,最好保持價值。 – 2013-04-11 13:43:37