2016-05-15 14 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が含まれているため、何のポイントもありません。

関連する問題