2010-02-06 111 views
0

我有一个Parts列表,其中一些需要一个指向Engine的指针,让我们称它们为EngineParts。我想要的是使用RTTI查找这些EngineParts,然后为它们提供引擎。通过基类提供依赖关系

问题是如何设计EnginePart。我在这里有两个选项,如下所述,我不知道选择哪一个。 选项1速度更快,因为它没有虚拟功能。 如果我想Clone()对象,选项2更容易,因为没有数据,它不需要Clone()函数。

有什么想法?也许还有第三种选择?

选项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的单独列表)

谢谢

+0

也许我应该详细说明一下。它实际上是一个从磁盘加载的图形和n元树的混合体,而零件是由加载程序使用抽象工厂创建的。前n个部分需要一些全局属性(我使用Engine作为示例属性),它们不包含在图本身中。所以这就是为什么我不能在构造函数中提供它,我必须在之后“注入”它。 – Eric 2010-02-06 21:40:06

回答

0

太糟糕了,说'部分不能容纳引擎'的答复被删除,因为那是其实是解决方案。

由于需要不完整的引擎,我找到了第三条道路:


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())。

这隐藏了离合器的引擎,给我几乎只有一种方法来编码。

0

现代编译器中的虚拟功能(大约过去10年)速度非常快,特别是对于台式机目标,并且速度不应该影响您的设计。

无论您想从指针/引用到基础复制,您仍然需要一个克隆方法,因为您必须允许(此时未知)派生类来复制它们自己,包括像vtable这样的实现细节指针。 (虽然如果你坚持一个编译器/实现,你可以基于它做快捷方式,并且每当你想使用另一个编译器或者想升级你的编译器时重新评估那些快捷方式。)

这样可以摆脱所有你列出的标准,所以你回到不知道如何选择。但这很简单:选择最简单的一个。 (也就是说,我不能说这个化妆的例子,但我怀疑这是第一个。)