2011-07-26 2 views
3

私はclass.cppclass.hで定義されたクラスを持っています。このクラスは、プライベートなメンバやメソッドに対して、stuff.h(もちろんstuff.cpp)で定義されているいくつかの構造体/クラス/型/何でも使用します。私の主なプログラムはmain.cppで、#include s class.hですが、stuff.hのものは気にしません。違いがある場合は、class.cpが動的に読み込まれるはずです(.dll/.so)。
main.cppに名前空間の汚染を引き起こし、最終的なプログラムにリンクすることによって余分な肥大化を招くだけなので、stuff.hclass.cppstuff.cppにのみ含まれているのが理想です。
class.hにはprivate:の部分が使用されているので、stuff.hclass.hに含めなければならないという問題があります。 main.cppclass.hを持ち込むので、stuff.hも得られます!プライベートデータのヘッダーだけを.hファイルに含めます。

これは明らかです。 C#では、これは部分クラスによって解決できます。どのようにC++でこれを行うでしょうか?

+0

'main.cpp'に含まれる' stuff.h 'のシンボル、または実際の定義が心配ですか?意味 - 'stuff.h'のシンボルの前方宣言だけがある場合、それでも' main.cpp'には問題がありますか? –

+0

@ eli-iserフォワード宣言とは何ですか? – baruch

+0

Sorenとks1322で説明されているように、 'class Stuff'を持っていれば' class stuff 'を '#include' stuff.h'を使わずに 'class Stuff;'を使って 'class.h'で使うことができます。これは 'class.h 'が' #include'なしでクラス 'Stuff'を認識するようにenalbeします。 –

答えて

2

これは、pImpl aka Opaque Pointersを使って行います。ここで公開するクラスには、部分的に定義された構造体である属性が1つしかありません(代わりに、void *が代わりに使用されることもあります)。

部分的に定義された構造体はstuff.cppの内部で完全に定義されていますが、すべてが期待どおりに機能します。コンストラクタとデストラクタを新規作成/削除する必要があります。あなたのコピーコンストラクタとあなたの代入演算子に特別な準備をしてください。operator= - ほとんどの人はコピーコンストラクタと代入演算子をprivateにするだけです。

+0

スマートポインタを使ってpimplを実行し、プライベート実装の構築/破壊に関するトラブルを取り除くこともできます。 –

+0

@マーティーニョ、興味深い提案、あなたは参照できる例がありますか? – Soren

+0

ブーストドキュメントの例があります:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/sp_techniques.html#pimpl(そのページには他の宝石がいっぱいです) –

0

ここにはPimpl Idiomが必要です。 Pimplの主なアイデアは、宣言を定義するのではなく、実装で宣言することです。これにより、ヘッダファイルの実装依存関係を取り除くことができます。これは、特に大きなプロジェクトでは、コンパイルのスピードアップにつながります。

関連する問題