Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有多个成员变量的类的最佳实践_C++_Class Design_Root Framework - Fatal编程技术网

C++ 具有多个成员变量的类的最佳实践

C++ 具有多个成员变量的类的最佳实践,c++,class-design,root-framework,C++,Class Design,Root Framework,简短问题: 如果必须有多个(甚至超过200个)成员变量(每个变量都是我们分析中感兴趣的物理量图)。声明这些变量的最佳位置是什么 详细解释: 我用于分析的框架创建了一个类来循环事件,它可以缩小到 constructor() initialize() execute() finalize() 在标题中,您可以声明如下指针(这显然是我们必须使用的ROOT包的要求): 然后在构造函数中必须初始化指向某个确定内存地址的指针(据我所知,这是为了以后从文件中读取数据) 然后在initialize函数中打开一

简短问题: 如果必须有多个(甚至超过200个)成员变量(每个变量都是我们分析中感兴趣的物理量图)。声明这些变量的最佳位置是什么

详细解释: 我用于分析的框架创建了一个类来循环事件,它可以缩小到

constructor()
initialize()
execute()
finalize()
在标题中,您可以声明如下指针(这显然是我们必须使用的
ROOT
包的要求):

然后在
构造函数中
必须初始化指向某个确定内存地址的指针(据我所知,这是为了以后从文件中读取数据)

然后在
initialize
函数中打开一个包含以前存储的数据的文件,并将类成员的地址设置为指向文件中包含的对象(我不知道这是如何工作的,或者我的语句是否精确):

然后在
execute
中,在循环中调用函数,每个事件调用一次,然后您将执行所需的物理选择

execute()
{
  // I omit here where the `i` index comes from as not relevant
  if(m_jet_pt->at(i) > 30)

    h_jet_pt->Fill();
}
最后,在
finalize
功能中,您将在做出选择后完成每个事件所需的所有操作,例如将直方图存储在另一个文件中

finalize()
{
  h_jet_pt->Write();
}

现在,我有20个量子位用于
喷射
,30个量子位用于
电子
,30个量子位用于
μ子
,诸如此类,你可以看到成员变量的数量是多么巨大!很快代码就变得一团糟了,那么您的专业程序员将如何处理这种情况呢?希望这足够清楚

ROOT具有相当不错的I/O功能,支持从/到TTree的任意数据结构的读写。通常,您只需编写一个类,该类的数据结构与您的单个“度量”或“事件”对应。这取决于您如何在此类课程中组织多个物理量。该结构可以是平面的,在同一级别上有200个数据成员,或者包含一些其他类类型的封装非POD数据成员。好的是,ROOT可以很好地处理所有不同类型的数据,包括标量、数组、指针和stl容器作为数据成员

创建类的对象后,它可以与TTree上的顶级分支关联,如下所示:

tree->Branch(branchname, className, &p_object, bufsize, splitlevel)
有关详细信息,请参见案例B:


如果为所有数据结构生成字典和拖缆,ROOT将自动创建子分支,从而节省大量手动工作。之后,您可以使用TTree的方法,如Fill()和GetEntry(),通过在树中保存对象或从树中读取值来创建条目。

如果数据是相同的类型,请使用或为什么不让类似
jet
的东西有自己的类?“如果必须有多个(甚至超过200个)成员变量…”这几乎可以肯定是一个严重的设计缺陷。如前所述,有各种容器类来保存多个值。如果使用抽象接口时这些行为不同,ans会将它们存储在容器中。查看这些成员所属的类会很有用我同意@user3528438的说法。您可以为单个粒子类型创建一个包含m_jet_pt和h_jet_pt的特殊类,并在任何类容器中处理不同的瑕疵,如向量或其任何特化,以包含额外选项。这种方法允许在不需要重新编译的情况下更改集合。容器类可以携带集合的控件并定义用户界面。
TFile *file = new TFile("filename.root");

// The tree is where the data is (for some reason ROOT uses C style casts)
TTree *tree = (TTree*)file->Get("MyTree");

// this is how to set the address of the member class pointer
// to point to the data in the tree:
tree->SetBranchAddress("m_jet_pt", &jet_pt);
execute()
{
  // I omit here where the `i` index comes from as not relevant
  if(m_jet_pt->at(i) > 30)

    h_jet_pt->Fill();
}
finalize()
{
  h_jet_pt->Write();
}
tree->Branch(branchname, className, &p_object, bufsize, splitlevel)