0

独自の静的ライブラリに配置したC++クラスを作成しました。

public:また、他の人がクラスの一部を見ることができるようにする最小限のヘッダーファイルを作成することにしました。したがって、基本的に元のヘッダーファイル(かなり長く、クラスのprivate:と部分などが含まれています)を取得し、部分(短い、コンストラクタ/デストラクタと1つのパブリック関数のみ)public:以外のすべてを削除しました。public:

テストするために、ライブラリを使用するダミープロジェクトを作成しました。そのプロジェクトで最小限のヘッダーファイルを使用すると、次のようなメッセージが表示されてクラッシュします。

test(44349) malloc: *** error for object 0x7fdab2c242e8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

しかし、元のヘッダーファイルをインクルードするときはいつでも、正常に機能します。

何が問題なのですか?-Wall最小ヘッダーファイルと元のヘッダーファイルの両方を使用して、正常にコンパイルされます(警告がなくても)。

4

2 に答える 2

5

これは機能せず、単一定義規則に違反します。すべてのクラスには正確に1つの定義が必要であり、各変換ユニットはまったく同じ定義を参照する必要があります。そうでない場合、プログラムの形式が正しくなく、さらに悪いことに、診断は必要ありません。

クラスを2つの部分に分割し、実装コンポーネントを公開する必要がないPIMPLイディオムを使用した方がよい場合があります。

// Ship this:

class FooImpl;

class Foo
{
    std::unique_ptr<FooImpl> impl;
public:
    Foo();
    void do_magic();
};

// Don't ship this:

class FooImpl { void magic(); };
void FooImpl::magic() { /* secret code */ }

Foo::Foo() : impl(new FooImpl) { }
void Foo::do_magic() { impl->magic(); }

PIMPLクラスの優れた汎用フレームワークについては、Herb SutterのGotW#101を参照してください。

于 2012-07-24T22:18:37.797 に答える
0

クラスのプライベート/保護された部分をインターフェイスから削除することはできません。インターフェイスを使用するコンパイラは、(プライベート/保護された)メンバー変数と仮想関数を認識している必要があります。そうしないと、クラスインスタンスと仮想テーブルについて誤った考えを持ってしまいます。 。

于 2012-07-24T22:12:43.430 に答える