背景:創建類的實例
在我的遊戲引擎,我有一個用來通過解析一個腳本文件來創建遊戲實體通用的「腳本解析器」。所以在代碼中你可能會有類似的東西MyEntity* entity = MyScriptParer::Parse("filename.scr");
任何要編寫腳本的類都從一個通用基類繼承。在內部,在遊戲引擎有使用這個有些特殊的類 - 顆粒,字體等,這都很好地工作在解析器 - 見下文
std::string line;
std::getline(ifs, line);
if (line == "[FONT]") {
CFont* f = new CFont();
f->readObject(ifs);
}
else if (line == "[PARTICLE]") {
CParticle* p = new CParticle();
p->readObject(ifs);
}
...
提取我的問題帶有如何處理用戶定義的類在IE班使用遊戲引擎的遊戲。基類有一個抽象方法readObject
,所以繼承的任何東西都必須實現這個方法。
問題是解析器如何知道新類?例如說我有一個CVehicle
類解析器現在需要知道的認識「[車輛]」,也可以創建一個new CVehicle
有什麼辦法來存儲陣列/圖類類型或東西,以便也許我可以有一個函數來註冊一個帶有字符串的類類型列表來提供一個查找來創建新的實例?
一個長鏡頭的位,因此如果任何人有關於如何處理,他們將受到歡迎
嗨,感謝您提供的信息豐富的答案。我會試試看看它是如何發展的。 – Zammalad
好的,我喜歡這種方法,因爲這意味着我可以讓整個腳本閱讀器更通用一些,甚至在添加新遊戲引擎時添加內部腳本。儘管我試圖實現並遇到一個問題。它是與'CMyCustomClass :: GetClass()'部分。如果我嘗試按照您的示例傳遞它,編譯器會失敗,並且不能使用「CFont *()」類型的左值初始化類型爲'CBaseClass *(*)()'的參數:不同的返回類型('CBaseClass *' vs'CFont *')「 – Zammalad
我解決了我的問題。在這種情況下,我傳遞一個指向新客戶類「CFont」的指針的簡單錯誤,而不是將它傳回基類指針 – Zammalad