我有部分的列表,其中一些需要一个指向引擎,让我们称之为EngineParts。我要的是使用RTTI找到这些EngineParts然后给他们的引擎。

问题是如何设计EnginePart。我这里有两个选择,下面描述的,我不知道该选哪一个。 选项1是更快,因为它没有一个虚函数。 选项2是如果我想克隆()对象,因为没有数据它不需要一个克隆()函数更容易。

任何想法?也许有第三种选择?

选项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的单独列表的简单解决方案)

由于

有帮助吗?

解决方案 2

太糟糕了答复,指出“的一部分,不能保持发动机”被删除,因为这实际上是解决方案。

因为需要不完整的引擎,我发现了第三种方式:


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()需要几个PARAMS该引擎可以不知道,也没有办法它可以“注入”之类的引擎指针此值在选项1和2(井注入..除非我还提供了一个虚拟GetParams ())。

这个隐藏离合器发动机,给我几乎只有一种方式来编写的。

其他提示

在现代编译器的虚拟功能(约近10年)是非常快的,尤其是对于台式机的目标,那速度应该不会影响你的设计。

您还需要一个克隆方法不管,如果你想从一个指针 - /参考 - 底部的复制,你必须允许派生类复制自己(此时不详),包括实施细节,如虚表指针。 (但如果你坚持一个编译器/执行,您可以根据它的快捷方式,而不仅仅是那些想使用其他编译器或想升级你的编译器每一次重新评估。)

这是摆脱的你所列出的所有标准,所以你回不知道如何选择。但是,这很简单:选择一个最简单的为你做。 (这就是我不能基于此制造的例子的说,但我怀疑这是第一个。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top