-1

私はC ++の学習段階にあります。C++ オブジェクト モデルの内部を読みながら、さまざまなオブジェクト モデルを理解しました。

1) 単純なオブジェクト モデル。

2) テーブル駆動オブジェクト モデル。

3) c++ オブジェクト モデル。

質問:

その主な欠点は、非静的クラス データ メンバーの追加、削除、または変更が行われたクラスのオブジェクトを使用する未変更のコードを再コンパイルする必要があることです。

上記の発言は理解しました。クラス定義に変更があった場合、同じクラスを使用するソース コードを再コンパイルする必要があります。

つまり、再コンパイルせずに同じことを達成する理由がいくつかあります。どうやってするか?誰かが素晴らしいだろうサンプル コードを提供する場合。Linux/Ubuntu で g++ を使用しています。

4

3 に答える 3

6

クラスの変更中に再コンパイルを防ぐための典型的なイディオムは PImpl です。

http://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B

于 2013-02-27T12:42:02.170 に答える
1

他の言語/オブジェクト モデルで同じことを実現する方法はあるかもしれませんが、C++ では実現できません。そうでなければ、それは C++ オブジェクト モデルの欠点にはなりません。

ただし、結果を軽減することは可能です。たとえば、(1) ライブラリから純粋な抽象クラスとも呼ばれるインターフェースのみをエクスポートし、(2) 公開されたインターフェースを変更しないことです。新しい API を追加する必要がある場合は、新しいインターフェイスを介してエクスポートします (古い/変更された実装クラスを参照している場合でも)。

コードサンプルがそれほど役立つかどうかはわかりません。これはコーディング技術ではありません。純粋な抽象クラスとは何かを知っていれば、準備は万端です。

于 2013-02-27T12:54:48.833 に答える
0

ヘッダーで実装の詳細を公開することには利点があるだけでなく、詳細が変更されたときに強制的に再コンパイルするという欠点があることに注意してください。関数をより簡単にインライン化できるため、実行時のパフォーマンスが向上します。そのトレードオフがコストに見合う場所と時期を決定する必要があります。

追加レベルの間接参照を導入することにより、ソースファイル内のすべてのプライベート実装の詳細を非表示にすることができます。一般的なアプローチの1つは、プライベート実装(または「pimpl」)へのポインタのイディオムです。次に例を示します。

// Header file
class Thing {
public:
    Thing(...);
    ~Thing();

    // Public interface

private:
    struct Impl;
    std::unique_ptr<Impl> impl;
};

// Source file
struct Thing::Impl {
    // private details
};

Thing(...) : impl(new Impl(...)) {}
~Thing() {}

// Implementation of public interface

もう1つの可能性は、実装を含む具体的なインスタンスを作成するための1つ以上のファクトリを使用して、抽象インターフェイスを定義することです。次に例を示します。

// Header file
class Thing {
public:
    virtual ~Thing() {}

    static std::unique_ptr<Thing> make(...);

    // Pure virtual public interface
};

// Source file
class ThingImpl : public Thing {
    // Implementation of public interface

    // Private implementation details
};

std::unique_ptr<Thing> Thing::make(...) {
    return std::unique_ptr<Thing>(new ThingImpl(...));
}

これらのアプローチはどちらも、すべての実装の詳細をソースファイル内に配置するため、詳細が変更されたときに再コンパイルする必要があるのはそれだけです。ただし、どちらも追加のポインター間接参照や間接関数呼び出しを導入し、実行時のパフォーマンスに影響を与える可能性があります。

于 2013-02-27T14:17:12.577 に答える