【问题标题】:Loop over objects with similar names遍历具有相似名称的对象
【发布时间】:2014-12-12 15:59:10
【问题描述】:

我有一组名为 object1, object2, object3, ... 的 C++ 通用对象。 这些对象由一个类构造而成,该类提供一些功能,例如“合并”两个或多个对象的Add()

我想要做的是循环对象并将它们合并在一起。如果我使用

for (int i = 1 ; i <= 30 ; i++){

    TString::Format("object%d",i)->Add();

}

显然它不能工作,因为我试图使用错误的指针来访问一个对象来调用它。

首先,我想知道是否有一种方法可以遍历对象,其次是否有此过程的特定名称。

编辑我想过使用arrayvector 并从那里访问它,但为了填充数组我必须给出许多push_back 命令,这不是如果您有 100 对象,则很方便。

【问题讨论】:

  • 创建一个数组或其他任何类型的对象列表并对其进行迭代
  • 创建一个数组(some_type object[30])怎么样?然后您可以从object[0]object[29] 对其进行索引。 (for (size_t i = 0; i &lt; 30; ++i) { object[i].Add(); })
  • 你应该知道什么时候使用数组
  • 但是如果我有 100 个对象但仍然具有相似的名称,我将如何填充向量?
  • @Thanos 我不明白你的问题。我建议您甚至没有这些对象N变量,而是将您的对象直接存储在某种数组或向量中。

标签: c++ string pointers object for-loop


【解决方案1】:

这是不可能的,因为变量名是 C++ 中的编译时工件。除了“从侧面”获取附加信息的调试器之外,程序不能通过变量名访问变量。

如果您需要将对象与名称或索引相关联,请将所需的对象放入容器中。如果您需要按名称访问,请使用map&lt;string,YourObjectType&gt;unordered_map&lt;string,YourObjectType&gt;。如果需要按索引访问,请使用vector&lt;YourObjectType&gt;

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();
}

上面的示例创建了一个指针容器,以便循环访问原始对象,而不是存储在向量中的副本。您可以通过将原始对象变量存储在向量中并通过索引而不是名称访问它们来消除原始对象变量。

【讨论】:

  • 非常感谢您的回答!我曾想过使用arrayvector,但我必须用具有相似名称的对象手动填充它。例如,如果有 100 或 1000 个对象,手动填充数组不是很方便。
  • @Thanos 如果您有 100 多个类似命名的变量,您可以通过名称单独访问这些变量,那么您的设计就有问题:它们应该从一开始就进入一个集合,而不是作为单个变量。
  • 我有一个由 root(root.cern.ch/drupal) 创建的文件,其中包含很多直方图(TH1F 类),所以设计是这样的,不幸的是无法访问创建。 ..
  • @Thanos 啊,好的,针对自动生成的文件编写手动代码是个问题。我对root.cern的工作一无所知,但如果你需要处理它,你可以使用答案中描述的指针方法。
【解决方案2】:

如果您可以访问首先创建对象的代码:

在创建/构造期间建立一个键值对并将它们输入到地图中。

键将是“Object1”、“Object2”等。值将是指向刚刚分配/创建的对象的指针。

将这些对推送到地图中。

当需要迭代一组对象时,重新创建该名称(“ObjectN”)并在映射中查找,以取回指向该对象的指针。

[
  ["Object2", ptr-to-Object2]
  ["Object7", ptr-to-Object7]
  ...
]

这不会假设有关索引等的任何内容。您建立一个名称到对象的关联并在迭代时查找它。

【讨论】:

  • 哇!这是一个非常好的建议!不幸的是,我无法访问源代码,尽管如果我这样做了,我不知道如何设置它......
猜你喜欢
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多