2015-05-11 75 views
2

我正在閱讀Scott Meyers的Effective C++,並且我對第31項「最小化文件之間的編譯依賴關係」有疑問。文件和疙瘩成語之間的編譯依賴關係

在示例中,他展示了疙瘩成語:

#include <string> // standard lib shouldn't be forward-declared 

#include <memory> 

class PersonImpl; // Forward decl of Person impl.class 

class Date;  // forward decls of classes used in Person interface 
class Address; 

class Person 
{ 
public: 
    Person(const std::string& name, const Date& birthday, const Address& addr); 
    std:string name() const; 
    std:string birthDate() const; 
    std:string address() const; 
    ... 
private: 
    std::tr1::shared_ptr<PersonImpl> pimpl; 
}; 

然後,他這樣說:

避免使用對象時,對象引用和指針會做。您可以定義引用和指向類型的指針,只有該類型的聲明 。定義類型的對象需要存在該類型的定義 。

是否曾經有過這樣的情況:不能使用使用引用或指針?難道你不能使用你設計的全部類的疙瘩成語嗎?

回答

1

某些情況下需要完整的類型。 E.g:當你想通過值的向量來存儲對象:

std::vector<Person> persons; // Person must be complete 

你不能在這裏使用的基準,並假設你想避免空者(= nullptr)。

請注意,據我所知,現在由於增加了複雜性,性能和存儲懲罰,避免了pimpl習語。

+0

這很有道理,我沒有想到模板。性能損失是從堆中分配給堆棧的,對吧? –

+1

表現處罰:是的。關於複雜性:打開文件時非常令人沮喪,所有類成員都只是轉發參數。 (或者他們?) – erenon

+0

我同意,當我讀它時聽起來有些過於複雜,這就是爲什麼我不得不問。感謝您的輸入! –