2017-08-28 123 views
0

很長一段時間的讀者,我想一個模板,返回不同的類

我在想,如果有人可以幫助我做我的代碼簡單一點使用模板返回從相同的基本派生不同的類。所以我可以調用類的函數而不是重寫管理器類中的每個對象調用的函數。這裏一個我目前的函數的例子電話:

void setLoopImage(AnimationManagerIndex & managerIndex, bool b) 
{ 
    switch (managerIndex.animationClass) 
    { 
     case ANIMATION_CLASS_BASE: 
     { 
      vAnimationObjectBase[managerIndex.index].setLoopImage(b); 
      break; 
     } 
     case ANIMATION_CLASS_MOVING: 
     { 
      vAnimationObjectMoving[managerIndex.index].setLoopImage(b); 
      break; 
     } 
     case ANIMATION_CLASS_MOVING_BEZIER: 
     { 
      vAnimationObjectMovingBezier[managerIndex.index].setLoopImage(b); 
      break; 
     } 
    } 
} 

我想創建一個返回像這樣這些類模板函數:

template<class T> 
T & getAnimationObject(AnimationManagerIndex & managerIndex) 
{ 
    switch (managerIndex.animationClass) 
    { 
     case ANIMATION_CLASS_BASE: 
     { 
      return vAnimationObjectBase[managerIndex.index]; 
     } 
     case ANIMATION_CLASS_MOVING: 
     { 
      return vAnimationObjectMoving[managerIndex.index]; 
     } 
     case ANIMATION_CLASS_MOVING_BEZIER: 
     { 
      return vAnimationObjectMovingBezier[managerIndex.index]; 
     } 
    } 
} 

所以第一個函數將變爲:

void setLoopImage(AnimationManagerIndex & managerIndex, bool b) 
{ 
    getAnimationObject(managerIndex).setLoopImage(b); 
} 
+3

你說這三個是從相同的基本衍生?然後你不需要模板。只需使用'Base&'作爲返回類型即可。 – HolyBlackCat

+1

你的嘗試有什麼問題?你有什麼實際的*問題?作爲一個長期的讀者,你應該有時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask),如果你還沒有這樣做,那麼請這樣做。 –

回答

1

你不需要這個模板。您可以通過創建一個定義了(純)虛擬setLoopImage函數的基本(抽象)類來實現此目的。

class Base 
{ 
    virtual setLoopImage(bool b) = 0; 
}; 

推導以下每個類從上面的一個:vAnimationObjectBase,vAnimationObjectMoving和vAnimationObjectMovingBezier。

然後你getAnimationObject函數將返回基地&:

Base& getAnimationObject(AnimationManagerIndex & managerIndex) 
{ 
    switch (managerIndex.animationClass) 
    { 
     case ANIMATION_CLASS_BASE: 
     { 
      return vAnimationObjectBase[managerIndex.index]; 
     } 
     case ANIMATION_CLASS_MOVING: 
     { 
      return vAnimationObjectMoving[managerIndex.index]; 
     } 
     case ANIMATION_CLASS_MOVING_BEZIER: 
     { 
      return vAnimationObjectMovingBezier[managerIndex.index]; 
     } 
    } 
} 

每一個派生類將實現純虛函數setLoopImage,你會調用它的派生類。

+2

爲了進一步改進解決方案,只有*一個*對象集合,並且整個'switch'語句消失,剩下的只是一個'return'。 –

+0

@Someprogrammerdude同意。 – VuVirt

+0

謝謝你的回答,我現在就實施它。我打算將所有類的不同功能轉移到一個類中,但是現在我將它們單獨寫出來以確保一切正常。我將如何去創建不同類的向量,而不用創建一個基礎指針向量,而這些向量我都有不好的經驗。 –

1

通常解決這個問題,是經典的繼承:

struct drawable_interface { 
    virtual void setLoopImage(bool) = 0; 
}; 

drawable_interface & getAnimationObject(AnimationManagerIndex & managerIndex) { 
    /*Same code as before*/ 
} 
相關問題