2017-03-03 137 views
0

與其他用戶一樣,我試圖實現不可能或非常複雜的事情。我讀了很多問題,比如「遍歷所有派生類」,但正如我所見,這是不可能的。但我想問的是可以自動註冊派生類。也許使用一些模板。或者,例如使用帶有特殊名稱的模板函數(例如template<typename T> void register(SomeFabric* f, T* t = new T()))並遍歷所有'註冊'類型(如果可能的話)。或者使用另一個特殊函數(例如void register(SomeFabric* f, Base* base))並遍歷所有可用類,如果可以使用此參數調用此特殊函數,並且可以實例化可迭代類 - 請調用它。 如果完全不可能:註冊類最簡單(開發者操作的最低數量)方式是什麼?使用C++自動註冊派生類11

+1

您似乎想要自我註冊抽象工廠。像這裏描述的那樣:http://www.dorodnic.com/blog/2014/03/29/abstract-factory/ – Baldrick

+0

@Baldrick葉,這是我想要的。 Thankyou爲鏈接。這非常有用。如果沒有人會提供更有用的東西,我想我會請你寫回答。 – Megaxela

+0

您正在討論解決某些問題的方法。該解決方案與「迭代所有派生類」或「註冊派生類」有關。首先,這意味着什麼*不清楚*(你的意思是實例嗎?類?你想要在註冊表中重複使用哪些類?),並且計算出你想要的功能是不可能的,因爲你不需要提到這個「解決方案」試圖解決的根本問題。請澄清潛在的問題。通過迭代派生類來明確你的意思,並給出具體的程序行爲例子。 – Yakk

回答

0

最簡單的解決辦法是保持在基類的靜態字段派生類的列表:

static vector<*BaseClass> children; 

然後寄存器新的BaseClass的構造函數實例:

children.push_back(this) 

而且刪除來自基類析構函數中的註冊表。

不要從派生類忘記調用父類的構造

Derived(int a, int b) : BaseClass() {...} 

注意,雖然這種解決方案將工作,它是差但從架構的角度。它介紹了全球的狀態以及與之相關的所有問題。

+0

什麼是* MyClass? – Yakk

+0

將其重命名爲BaseClass。 –

+0

什麼是'* BaseClass'?這些令牌沒有意義。更改標識符不會改進它。 – Yakk