我假設您的getRandomObject
函數中已知所有可能的子類,並且您希望在每次調用時創建一個新實例。那麼這是一個可行的解決方案:
A *getRandomObject() {
int r = getRandomIntInRange(0, 3); // Some method returning a random int from [0,1,2]
switch (r) {
case 0: return new B1();
case 1: return new B2();
case 2: return new B3();
default: return NULL; // should never come here...
}
UPDATE:
如果你的方法可能不知道的所有可能的子類,登記機構是可能的,在那裏你存儲返回新的實例(工廠)functionoids。
快速概要:
// Somewhere in your code
A *b1Factory() { return new B1(); }
A *b2Factory() { return new B2(); }
A *b3Factory() { return new B3(); }
// somewhere you have a factory list
typedef A* (*aSubclassFactoryFunc) (void);
std::vector<aSubclassFactoryFunc> factories;
A *getRandomObject() {
int r = getRandomIntInRange(0, factories.size()); // Some method returning a random int from [0,1,2,...,factories.size()]
return factories[r](); // Call random factory
}
新的子類只是必須添加一個工廠方法工廠名單。
更新2:
註冊機制,可以做這樣的:
#define REGISTER_A(B) \
struct b_subclass_register_##B {\
b_subclass_register_##B() {\
registerASubclass(b_subclass_register_##B::create);\
}\
static A *create() { return new B; }\
} dummy_instance_##B;
這是創建一個結構,並創建全球範圍內的虛擬實例的萬客隆。在它的構造函數中,子類是註冊的。
你在你的子類CPP文件使用,如:
REGISTER_A(B1);
這沒關係。我只是想解決這個問題。我需要從子類中獲得隨機對象。如何做到這一點並不重要。 –
你有收集兒童班嗎?也許是指向基類的向量?然後只需隨機選擇一個元素。但是,如果您沒有自己的對象集合,那麼不可能找到所有分配和實例化的對象。 –
你到底在幹什麼?如何生成隨機數字?如何創建新對象? – nwp