我想注册给定类的所有对象,以便稍后我可以使用迭代它们的静态方法。我想出了下面的解决方案。我的想法是,我会将这个课程提供给与我合作的其他人,他们将派出课程来设计自己的模块。但是,我不得不将指针数组初始化为一个大尺寸,因为我不知道究竟会创建多少个这样的对象。有没有办法在编译时找出创建的对象数量(如果它们都是静态声明的那样?)
class Module {
static Module* module_list[];
static int count;
public:
Module(string str){
id = count;
name = str;
module_list[count++] = this;
}
static void printModules(){
for(int i = 0; i < count; i++)
cout << module_list[i]->name << endl;
}
int id;
string name;
};
Module* Module::module_list[256];
int Module::count = 0;
Module x("module x"), y("module y");
int main(){
Module::printModules();
}
注意:我最初的目标是在编译时自己创建列表,但是,我不知道如何做到这一点。欢迎提出建议。
答案 0 :(得分:2)
有没有办法在编译时找出创建的对象数量(如果它们都是静态声明的话)?
不是真的,因为对象可能在单独的翻译单元中实例化。即使它们不是,但目前还没有反映特定翻译单元的方法,并且在C ++ 中寻找特定对象的所有实例化(除非你想使用外部的解析器+代码生成器解决方案)。
但是,我必须将指针数组初始化为一个大尺寸,因为我不确切知道将创建多少这些对象。
只需使用std::vector
,即表示您不需要任何固定限制:
auto& getModuleList()
{
static std::vector<Module*> result;
return result;
}
class Module {
public:
Module(string str){
id = count;
name = str;
getModuleList().emplace_back(this);
}