2016-05-15 76 views
0

我的目標是通過最小化包含來減少編譯時間,同時保持對類範圍內的內存分配的控制。使用常量指針避免包含

實例化方法

foo.h中

#include "Bar.h" //unneccessary if only number is used in a given source file 
struct Foo 
{ 
    Bar bar; 
    int number; 
}; 

常數指針方法

foo.h中

struct Bar; //no include, to use Bar Bar.h must also be included 
struct Foo 
{ 
    Bar *const bar; 
    int number; 
    Foo(); 
    Foo(const Foo&) = delete; 
    ~Foo(); 
}; 

Foo.cpp中

#include "Bar.h" 
Foo::Foo() 
: bar(new Bar()) 
{ 
} 

Foo::~Foo() 
{ 
    delete bar; 
} 

是否有使用常量指針這樣的,而不是實例變量任何其他注意事項?或者可能的替代方法?

+3

當模塊出現時,這種過度的聰明會讓你陷入困境。只需包括你需要的東西。 –

+1

其他的注意事項你的意思是超出你完全破解的拷貝構造函數和手動使用'new'的東西嗎? –

+0

準確的說:)複製構造不是必需的用例我有,所以我很高興刪除它們。已經更新了這個問題。你可以擴展'手動使用新',以及這是一個問題與任何其他使用新的問題相比?謝謝! –

回答

0

這是一個完全合法和標準的方法來最小化頭包括。事實上,一個可行的辦法是,總是通過一個不透明的指針訪問所有的私有成員的結構,使公衆頭球攻門僅僅高出

namespace detail { 
    struct xxFoo_impl; 
} 

class Foo { 
    detail::xxFoo_impl* xx; 
    public: 
    // ... stuff ... 
}; 

然後,在Foo.cpp中xxFoo_impl與所有成員定義變量,構造函數在堆上分配xx,並且所有對變量的訪問都通過xx指針。這樣,對類的私有成員的更改不會影響代碼的任何客戶端:頭不變,不需要重新編譯。

所以,不僅是使用指針來減少標頭中的東西,甚至還建議使用。 ;-)

但是,如果Foo的用戶都預計會訪問Bar成員,那麼沒有意義,因爲他們都將包括bar.h

相關問題