我有一組從對象公共基礎派生的對象,。我需要能夠在一個單獨的數據結構中註冊所有ApiObject,但我需要有一個實際的被創建對象的地址,而不是基類(我使用多重繼承)。創建構造函數初始化
我不能把代碼註冊在構造函數中的對象,因爲它不知道派生對象的地址;也不能將它放到派生類的構造函數中,因爲我們無法知道我們是否實際構造了另一個派生類(例如,如果類B
從A
繼承,並且都可以構造)。
所以我看到的唯一選擇是顯式調用註冊功能我們每次創建對象時,如
B* b = new B(...);
RegisterObject(b);
然而,這似乎並沒有得到很好的解決方案,因爲我有記得每次調用這個函數。
我想我應該給更多的上下文來解釋我爲什麼要這樣做。這些對象是通過一個重載的new運算符創建的,它需要該對象知道它創建的上下文(Lua狀態)。例如。
Foo* object = new(L) Foo(...);
// Foo is derived from ApiObject, and we want ApiObject to have a reference to L
目前,它以某種方式unelegant完成 - 新的運營商那裏的對象之前分配額外的字節,並存儲爲L指針,與其他一些數據來描述對象類型一起。基類然後通過init函數接收到一個指向這個'元數據'的指針。否則,首先想到的是虛函數,但它們不能從構造函數中調用,所以我不得不註冊基指針,但只在稍後的時間點調用虛函數,而我我不確定這比我目前的實施更漂亮。
你想對實際地址做什麼? –
@JoachimPileborg「這在派生和基礎對象中都是一樣的」---不,不是真的。 –
@JoachimPileborg這不會是基類和派生類中的相同物理地址。 –