【问题标题】:supplying dependency through base class通过基类提供依赖
【发布时间】:2010-02-06 20:54:15
【问题描述】:

我有一个零件列表,其中一些需要一个指向引擎的指针,我们称它们为 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单独创建一个列表这样简单的解决方案)

谢谢

【问题讨论】:

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

标签: c++ dependencies setter base-class


【解决方案1】:

现代编译器中的虚拟函数(大约在过去 10 年)非常快,尤其是对于桌面机器目标而言,这种速度不会影响您的设计。

无论如何,如果您想从指针/引用到基址复制,您仍然需要一个克隆方法,因为您必须允许(此时未知)派生类复制自己,包括诸如 vtable 指针之类的实现细节. (虽然如果你坚持使用一个编译器/实现,你可以基于它采取捷径,并且每次你想使用另一个编译器或想要升级你的编译器时重新评估它们。)

这消除了您列出的所有标准,因此您又回到了不知道如何选择的状态。但这很容易:选择对您来说最简单的一个。 (也就是说,我不能根据这个虚构的例子说,但我怀疑这是第一个。)

【讨论】:

    【解决方案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() 需要一些 Engine 无法知道的参数,所以它无法像在选项 1 和 2 中注入引擎指针那样“注入”这个值。(嗯..除非我还提供了一个虚拟 GetParams ())。

    这对离合器隐藏了引擎,并且几乎只给了我一种编码方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多