2012-03-23 74 views
0

我想使用腳本語言嵌入一些遊戲類。假設我的主要結構是:類的透明聚合

class BaseGameObject { 
public: 
    virtual ~BaseGameObject() { } 
}; 

class DerivedGameObject : public virtual BaseGameObject { 

}; 

然後,我想附上關於如何在腳本引擎上綁定此類的信息。我想保持凝聚力與他們儘可能小,所以我這個模板模式結束:

class ScriptLanguageBinder { 
public: 
    virtual void bind(VM* vm) = 0; 
}; 

template < typename GameObject > 
class GameObjectLanguageBinder : public GameObject, public ScriptLanguageBinder { 
    virtual void bind(VM* vm) { 
    vm->bind<GameObject>(static_cast<GameObject*>(this)); 
    } 
}; 

template < typename GameObject > 
BaseGameObject* gameObjectBuilder() { 
    return new GameObjectLanguageBinder<GameObject>(); 
} 

所以我有一個工廠,打造「包裝」 BaseGameObject和到位返回GameObjectLanguageBinder。這樣,系統的其餘部分將結果類用作BaseGameObject *,腳本語言依賴關係被限制在一組不會損害Game生態系統的類中,並且只有我的Script引擎需要知道它實際上是GameObjectLanguageBinder。這是工作得非常好,除了一點:

要從BaseGameObject取回ScriptLanguageBinder對象*我需要這樣做:

ScriptLanguageBinder* binder = dynamic_cast<ScriptLanguageBinder*>(my_game_object); 

,因爲我想擠都來自表現我可以這是不可取的代碼執行(這是一個手機遊戲引擎,所以是的,性能計數)。

所以我想知道是否有一些非突兀,透明的方式來實現這個沒有使用動態演員。我以爲在使用訪問者模式時,當你想擴展你訪問的類時,這種模式是一種阻礙,所以這是不行的。

ps:工廠是在這個例子中過分簡化。

+0

注意:如果打算只刪除一個指向基類的指針,絕對需要一個虛擬析構函數。從本質上講,這可以作爲您需要的一個虛擬功能。 :p – Xeo 2012-03-23 02:45:44

+0

是的,我知道。類沒有這些,我只是簡化了這裏的一切:) – scooterman 2012-03-23 11:34:59

回答

1

剛剛從代碼

  1. 虛函數應該是析構函數一眼。一個抽象基類,最好是這樣定義的:

    class BaseGameObject { 
    public: 
        virtual ~BaseGameObject() = 0; 
    }; 
    inline BaseGameObject::~BaseGameObject() {} 
    
  2. 類的繼承不應該是virtual。僅當基類將從繼承層次結構的不同分支繼承時才使用虛擬繼承。

  3. 活頁夾不應該從BaseGameObject派生,因爲它不是遊戲對象。難道它不是來源於BaseScriptObject之類的東西嗎?我在腳本引擎中是否誤認爲或者每個表達式/變量是對遊戲對象的引用或像int這樣的本機類型?和活頁夾實現像引用計數的引用語義?

+0

是的,1和2和3是錯誤,而我在創建問題時簡化了真實的代碼。我現在更新了:)。活頁夾必須使從本地對象到腳本引擎VM的功能和變量可見。但這些不是要點。我想知道是否有某種方法可以避免動態投射。 – scooterman 2012-03-23 11:47:12