C++ 访问C+中的对象+;名字

C++ 访问C+中的对象+;名字,c++,oop,for-loop,C++,Oop,For Loop,我需要访问一个名为TH2D的类的多个对象,该类由程序root()定义,使用for循环使用它的两个方法 对象名称的格式为run_0、run_1、run_2等 定义如下: TH2F* run_0 = new TH2F( "runID = 0", "projection during the first run", COLUMN, -COLUMN_BOUND, COLUMN_BOUND, RAW, -RAW_BOUND, RAW_BOUND ); 在第

我需要访问一个名为TH2D的类的多个对象,该类由程序root()定义,使用for循环使用它的两个方法

对象名称的格式为run_0、run_1、run_2等

定义如下:

TH2F* run_0 = new TH2F( "runID = 0", "projection during the first run",
            COLUMN, -COLUMN_BOUND, COLUMN_BOUND,
            RAW, -RAW_BOUND, RAW_BOUND );
在第一个对象的for循环中,我只需执行以下操作:

int bin = run_0->FindBin(j, k);
double Nphotons = run_0->GetBinContent(bin);
我需要做什么来让这样的东西在C++中的for循环中自动改变<强> Runi0到<强> Run1?<强>到<强> Runy2>……/P> 第1次迭代-

int bin = run_0->FindBin(j, k);
double Nphotons = run_0->GetBinContent(bin);
int bin = run_1->FindBin(j, k);
double Nphotons = run_1->GetBinContent(bin);
第二次迭代-

int bin = run_0->FindBin(j, k);
double Nphotons = run_0->GetBinContent(bin);
int bin = run_1->FindBin(j, k);
double Nphotons = run_1->GetBinContent(bin);
解决方法:

TH2F* run[8];
run[0] = new TH2F( "runID = 0", "projection during the first run",
            COLUMN, -COLUMN_BOUND, COLUMN_BOUND,
            RAW, -RAW_BOUND, RAW_BOUND );

....

for( Int_t id = 0; id != 8; ++id)
{
int bin = run[id]->FindBin(j, k);
double Nphotons = run[id]->GetBinContent(bin);
}

本质上,将它们放在一个数组中:

Thingy * thing1 = new Thingy();
Thingy * thing2 = new Thingy();
std::vector<Thingy *> things;
things.push_back(thing1);
things.push_back(thing2);
for(auto thing : things)
{
    thing->doStuff();
}
Thingy*thing1=newthingy();
Thingy*thing2=新的Thingy();
向量事物;
事物。推回(事物1);
事物。推回(事物2);
用于(自动事物:事物)
{
thing->doStuff();
}
实际上,考虑使用智能指针来代替,以免忘记以后删除它们。

编辑,因为人们不喜欢它泄漏:

std::shared_ptr<Thingy> thing1(new Thingy);
std::shared_ptr<Thingy> thing2(new Thingy);
std::vector<std::shared_ptr<Thingy> > things;
things.push_back(thing1);
things.push_back(thing2);
for(auto thing : things)
{
    thing->doStuff();
}
std::共享内容1(新内容);
std::共享内容2(新内容);
向量事物;
事物。推回(事物1);
事物。推回(事物2);
用于(自动事物:事物)
{
thing->doStuff();
}
如果你真的想要:

std::vector<std::shared_ptr<Thingy> > things;
for (int i = 0; i < count; ++i)
{
    things->push_back(std::make_shared<Thingy>());
}
for(auto & thing : things)
{
    thing->doStuff();
}
std::向量事物;
对于(int i=0;ipush_back(std::make_shared());
}
用于(汽车和物品:物品)
{
thing->doStuff();
}
免责声明:为简单起见,我假设
run\n
形式的令牌是函数,而不是对象。这个答案也应该适用于对象

在标识符中放置这样的数字的唯一方法是通过宏展开:

#define run(n) run_##n()
run(0); // Good. Will expand to run_0();
不幸的是,这在迭代中不起作用:

#include <iostream>

void run_0(){std::cout << 0;}
void run_1(){std::cout << 1;}

int main() {
  for (int i=0;i<2;++i) {
    run(i); // Bad. Will expand to run_i() and probably cause a compiler error.
  }
}
它不会像有人可能猜到的那样扩展为无限递归。 相反:

由于不存在接受两个参数的函数(希望不存在),它将导致编译器错误

那么,您唯一的赌注就是列出所有可能的函数,然后迭代:

void (*run[10])() = {run_0, run_1, run_2, run_3, run_4, run_5, run_6, run_7, run_8, run_9};

int main() {
  for (int i=0;i<10;++i) {
    run[i](); // Now it works!
  }
}

然后可以迭代此数组并执行所需操作。

将指向它们的指针放入数组中。迭代数组。假设run_0、run_1、run_2等已在集合中或已在某个位置定义。您是否在自己的代码中创建这些对象?然后,您将希望将它们(或指向它们的指针)直接放在容器中,而不是命名单个对象。如果对象在其他人的库中,如果必须多次遍历它们,您仍然可以将指向它们的指针存储在容器中。在容器上迭代/循环是很简单的。我在代码中创建了以下对象:TH2F*run\u 0=new TH2F(“runID=0,“第一次运行期间的投影”,COLUMN,-COLUMN\u-BOUND,COLUMN\u-BOUND,RAW,-RAW\u-BOUND,RAW\u-BOUND);例如,你有理由更新这些对象吗?这些对象基本上是图像投影的柱状图,我之前创建了新的TH2F,因为之后我需要用我将从文件中提取的信息填充它。我想问题是,你可以不必手动枚举这些对象就可以这样做吗。也许吧在宏或其他方式中使用###运算符。内存泄漏是因为我试图以最简单的形式提供OP所需的信息,而不是一个完整的程序。为什么首先要新建对象?它在哪里说OP需要动态分配?OP说“TH2F*run\u 0=new TH2F”“作为他创建对象的方式,他并不是真的要求一种新的方法来创建它们——他是在问如何迭代它们。我试图回答被问到的问题。那么你是说我不能自动地做我想做的事?另外,我已经编辑了我的问题,所以我想你可以更好地理解我想做什么:)是的,不是这样。不幸的是,这是不可能的。对于任何解决方案,都必须在某处列出所有对象。当然,除非您以
run\n
的形式定义对象,并且能够将其更改为更易于迭代的
run[n]
(即:一个运行数组,而不是几个单独的运行数组)好的,我想我明白了。我这样定义每个对象:
TH2F*run\u 0=new TH2F(“runID=0”,“第一次运行期间的投影”,COLUMN,-COLUMN\u-BOUND,COLUMN\u-BOUND,RAW,-RAW\u-BOUND,RAW\u-BOUND);TH2F*run\u 1=新的TH2F(“runID=1”,“第二次运行期间的投影”,列,-COLUMN\u-BOUND,COLUMN\u-BOUND,RAW,-RAW\u-BOUND,RAW\u-BOUND)如何将其放入数组?谢谢你,凯西奥!我感觉自己像一个真正的傻瓜:)有了你的建议,我不仅可以得到我需要的东西,还可以减少我的代码:)
TH2F* run[10]; // Up to 10 objects. Probably better to use an std::vector instead.
run[0] = new TH2F( "runID = 0", "projection during the first run", COLUMN, -COLUMN_BOUND, COLUMN_BOUND, RAW, -RAW_BOUND, RAW_BOUND );
run[1] = new TH2F( "runID = 1", "projection during the second run", COLUMN, -COLUMN_BOUND, COLUMN_BOUND, RAW, -RAW_BOUND, RAW_BOUND );