0

dynamic_casting について少し調べたところ、起動時に RAM にも読み込まれる RTTI と呼ばれるものが作成されることがわかりました。一部のプラットフォームでは、これもサポートされていないと思います。それで、それを避けるための良い解決策があるかどうか疑問に思っていました。

Statement クラスがあるとしましょう

class Statement
{
    std::list<Operand*> operands;
};

オペランドは、メモリアドレス、レジスタなどのサブクラスを持つクラスです。(不思議なことに、私はアセンブラを作ろうとしています.:P

dynamic_cast を使用してダウンキャストすることはできません。これもできれば問題です。しかし、それが Type であることを定義する列挙を Operand に追加するとどうなるでしょうか。

これを const にして、すべてのサブクラスのコンストラクターで定義できますか?

みなさんがどう思うか楽しみです。

キリスト教徒

4

2 に答える 2

2

ダウンキャストする場合は、インターフェイスを使用して適切なタイプを取得することを検討してください。ただし、サブクラスを明示的にリストすることもできます。

class Operand {
public:
    enum Type { OT_Address, OT_Register, /*...*/ };
    virtual Type type () const = 0;
    virtual AddressOperand * isAddress () { return 0; }
    virtual RegisterOperand * isRegister () { return 0; }
    //...
};

次に、ダウンキャストの代わりに、タイプに関連付けられたメソッドを呼び出すだけです。派生クラスはそれを実装します:

class AddressOperand : public Operand {
public:
    Operand::Type type () const { return Operand::OT_Address; }
    AddressOperand * isAddress () { return this; }
    //...
};
于 2012-07-26T08:56:42.450 に答える
2

タイプを作る - オプションです。

ただし、ジェネリックinterfaceを作成することを検討してOperandください。したがってmemory address、、、registerect はそのインターフェイスを補完し、それらをポリモーフィックに扱うことができます。

そのようなものを発明できない場合はinterface、クラスを再設計することを検討してください。共通のインターフェースを持つ必要がないように見えるからです。

コードの再利用が必要な場合はcomposition、 ではなくを使用してくださいinheritance

于 2012-07-26T07:44:05.793 に答える