2011-12-24 7 views
3

現在、DLLからdllexportを介していくつかのクラスをエクスポートしています。プライベートメンバーをプライベートにしてDLLに提供するヘッダーにプライベートなものは含まれません。クラスの間違ったサイズを割り当てるVisual Studio 2010のC++コンパイラ

問題は次のとおりです。コンパイラはクラスのサイズを知らないので、空のクラス(1バイトサイズ)を割り当てていると考えています。生成された.libで利用できる情報ではありませんDLLとは?プライベートデータを隠すことはできませんか?

明確にするために、DLLヘッダーが__declspec(DLLEXPORT)を使用して、クラス全体をエクスポートし、展開ヘッダ__declspecは(DLLIMPORT)

答えて

4

あなたがちょうど出た理由のためにそれを行うことはできません。プライベートメンバーのいないクラスはクラスと同じクラスではなく、プライベートメンバーのです。コンパイラが間違ったサイズを割り当てていない場合は、同じ名前の2つの異なるクラスを使用しています。

クラスのプライベートを非表示にするには、pimplイディオムのようなものを使用します。 (Opaque pointersおよびThe fast pimpl idiomを参照)。

+0

ありがとうございます。私のプライベートメンバーを隠しておくための工場が必要ですか? – Caian

+0

@Caian:これはアプローチの1つですが、より簡単な解決策は、オブジェクトに何らかのポインタがあることをユーザーに伝えるだけですが、オブジェクトの内容の詳細は明らかにしません。ユーザーコードでオブジェクトのサイズを判断することはできませんが、(隠された)API側がユーザーのためにすべてを管理する場合は問題ありません。 – wallyk

+0

@Caian: 'pimpl'イディオムを実装するための"ファクトリ "は必要ありません。 – Mat

関連する問題