2010-02-06 106 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這樣的實現細節指針。 (雖然如果你堅持一個編譯器/實現,你可以基於它做快捷方式,並且每當你想使用另一個編譯器或者想升級你的編譯器時重新評估那些快捷方式。)

這樣可以擺脫所有你列出的標準,所以你回到不知道如何選擇。但這很簡單:選擇最簡單的一個。 (也就是說,我不能說這個化妝的例子,但我懷疑這是第一個。)