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