我在c ++中有一组名为object1, object2, object3, ...
的公共对象。
这些对象是由一个类构成的,它提供了一些函数,比如Add()
" merges"两个或多个对象。
我想要做的是遍历对象并将它们合并在一起。如果我使用
for (int i = 1 ; i <= 30 ; i++){
TString::Format("object%d",i)->Add();
}
显然它无法工作,因为我试图使用错误的指针来访问一个对象来调用它。
首先,我想知道是否有办法循环对象,其次,如果有这个过程的特定名称。
编辑我想过使用array
或vector
并从那里访问它,但为了填充数组,我必须提供很多{{1}如果你有push_back
个对象就不方便。
答案 0 :(得分:2)
这是不可能的,因为变量名是C ++中的编译时工件。除了“侧面”获取附加信息的调试器之外,程序无法通过其名称访问变量。
如果需要将对象与名称或索引相关联,请将所需对象放在容器中。如果您需要按名称访问,请使用map<string,YourObjectType>
或unordered_map<string,YourObjectType>
。如果您需要按索引访问,请使用vector<YourObjectType>
:
vector<YourObjectType*> objectPtrs;
objectPtrs.push_back(&object0);
objectPtrs.push_back(&object1);
objectPtrs.push_back(&object2);
...
objectPtrs.push_back(&object29);
for (int i = 1 ; i <= 30 ; i++){
TString::Format(*objectPtrs[i])->Add();
}
上面的示例创建了一个指针容器,以便循环访问原始对象,而不是存储在向量中的副本。您可以通过将原始对象变量存储在向量中,并通过索引而不是按名称访问它们来消除原始对象变量。
答案 1 :(得分:0)
如果您可以访问首先创建对象的代码:
在创建/构建期间构建键值对,并将它们输入到地图中。
密钥将是“Object1”,“Object2”等。值将是指向刚刚分配/创建的对象的指针。
将这些对推入地图。
当需要迭代一组对象时,重新创建该名称(“ObjectN”)并在地图中查找,以获取指向该对象的指针。
[
["Object2", ptr-to-Object2]
["Object7", ptr-to-Object7]
...
]
这不会假设有关索引等的任何内容。您构建了一个名称到对象的关联,并在迭代时查找它。