0

我对 dynamic_casting 做了一些研究,我读到它创建了一个叫做 RTTI 的东西,它在启动时也被加载到 RAM 中。我认为在某些平台上也不支持此功能。所以我想知道是否有任何好的解决方案来避免它。

假设我有 Statement 类

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

操作数是一个具有更多子类的类,如内存地址、寄存器等。(有些人想知道,我正在尝试制作一个汇编程序。:P

我不能使用 dynamic_cast 进行向下转换,如果可以的话,这也很糟糕。但是如果我向 Operand 添加一个枚举,它定义了它的类型,所以我可以使用它的类型来向下转换 static_cast。

我可以使它成为一个常量,并在每个子类的构造函数中定义它,对吗?

我期待着大家的想法。

基督教

4

2 回答 2

2

制作类型 - 是一种选择。

但考虑interfaceOperand. 因此,您的memory address, register, ect 将实现该接口,您将能够将它们视为多态。

如果你不能发明这样interface的 - 考虑重新设计你的类,因为它们看起来不需要有一个公共接口。

如果您需要代码重用 - 使用composition,而不是inheritance

于 2012-07-26T07:44:05.793 回答
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 回答