0

パーツのリストがあり、そのうちのいくつかはエンジンへのポインターが必要です。それらをEnginePartsと呼びましょう。私が欲しいのは、RTTIを使用してこれらのEnginePartsを見つけて、それらにエンジンを与えることです。

問題は、EnginePartをどのように設計するかです。ここでは、以下に説明する2つのオプションがありますが、どちらを選択すればよいかわかりません。オプション1は仮想機能がないため、より高速です。オブジェクトがなければClone()関数を必要としないため、オブジェクトをClone()する場合は、オプション2の方が簡単です。

何かご意見は?多分3番目のオプションがありますか?

オプション1:


class Part;

class EnginePart : public Part {
    protected: Engine *engine
    public: void SetEngine(Engine *e) {engine = e}
};

class Clutch : public EnginePart {
    // code that uses this->engine
}

オプション2:


class Part;

class EnginePart : public Part {
    public: virtual void SetEngine(Engine *e)=0;
};

class Clutch : public EnginePart {
    private: Engine *engine;
    public: void SetEngine(Engine *e) { engine = e; }
    // code that uses this->engine
}

(実際の状況はもう少し複雑であることに注意してください。EngineParts用に別のリストを作成するような単純なソリューションを使用することはできません)

ありがとう

4

2 に答える 2

0

「部品がエンジンを保持できない」という回答が削除されたのは残念です。実際にはそれが解決策だったからです。

完全なエンジンは必要ないので、3 番目の方法を見つけました。


class Part;

class EngineSettings {
    private:
        Engine *engine
        friend class Engine;
        void SetEngine(Engine *e) {engine = e}
    public:
        Value* GetSomeValue(params) { return engine->GetSomeValue(params); }
};

class Clutch : public Part, public EngineSettings {
    // code that uses GetSomeValue(params) instead of engine->GetSomeValue(params)
}

GetSomeValue() にはエンジンが認識できないいくつかのパラメーターが必要なため、オプション 1 と 2 でエンジン ポインターが注入されたように、この値を "注入" する方法はありません。 .

これにより、エンジンがクラッチから隠され、コーディングする方法がほとんど 1 つしかなくなります。

于 2010-02-07T04:07:15.867 に答える
0

最新のコンパイラ (過去 10 年間) の仮想関数は、特にデスクトップ マシン ターゲットでは非常に高速であり、その速度は設計に影響を与えるべきではありません。

ポインター/ベースへの参照からコピーする場合は、(現時点では不明な) 派生クラスが vtable ポインターなどの実装の詳細を含めて自分自身をコピーできるようにする必要があるため、それでも clone メソッドが必要です。(ただし、1 つのコンパイラ/実装に固執する場合は、それに基づいてショートカットを作成し、別のコンパイラを使用したり、コンパイラをアップグレードしたりするたびにそれらを再評価することができます。)

これにより、リストしたすべての基準が取り除かれるため、選択方法がわからない状態に戻ります. しかし、それは簡単です。あなたにとって最も簡単な方法を選択してください。(つまり、このでっち上げの例に基づいて言うことはできませんが、これが最初のものだと思います。)

于 2010-02-06T21:10:40.863 に答える