2013-08-04 70 views
1

我正在編寫一個遊戲引擎,我試圖讓它的所有函數都是隱藏的,大部分是無規則的,所以當程序員編寫遊戲代碼時,他們不打擾如何或爲什麼需要這樣或那樣的東西,我試圖堅持把它純粹地作爲C++語言。C++通過繼承隱藏變量?

因此,舉例來說,我不希望他們:

//Going to create a new object on screen 
Object* newObject = gameEngine.gameModels.NewObject(); //I don't want this 

相反,我希望他們能夠做到這一點:

//Going to create a new object on screen 
Object* newObject = new Object(); 
newObject->Load("objectName"); //Done! 

但對於這個工作,我需要讓我的資源加載器的地址,以便我可以調用適當的負載功能,並進行實際的負載,這是我在做什麼:

class BaseModel 
{ 
    friend GameEngine; 
    private: 
     static ResourceModule* moduleAddress; 
}; 
class Model : public BaseModel 
{ 
    public: 
     void Load(char* assetName) 
     { 
      //use moduleAddress as needed 
     }; 
}; 
class GameEngine 
{ 
    public: 
     void Initialize() 
     { 
      myBaseModel.moduleAddress = &myResourceModule; 
     } 
    private: 
     ResourceModule myResourceModule; 
     BaseModel myBaseModel; 
}; 

但是我得到了一個「靜態ResourceModule * resourceModuleAddress」行的無法解析的外部錯誤,我無法獲得「friend」關鍵字的工作(它也表示變量是私有的,無法訪問) 。

有關如何完成我想要做的事情的任何建議,或者我如何才能使此代碼在上面工作?

+0

看起來好像你正在試圖爲C++實現*反射*。搜索這個關鍵字,我相信你會有很多解決方案。 – amit

+0

你有沒有在'BaseModel'中的'friend'聲明之前聲明'GameEngine'? – dyp

+0

錯別字已修復,並且在我將GameEngine聲明添加到它上面之後它就起作用了!謝謝! – Danicco

回答

4

無法解析的外部錯誤來自靜態成員的定義不足。這裏的解決方案:Initializing private static members

+1

*有點迂迴*:他們來自缺乏*定義*,不缺乏*初始化*。 – dyp

+0

好點,我已經更新了答案,謝謝! – BartoszKP

+0

我的錯誤都修復了,謝謝! – Danicco