草庐IT

c++ - 具有许多成员变量的类的最佳实践

coder 2024-02-26 原文

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

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

constructor()
initialize()
execute()
finalize()

在 header 中,您可以像这样声明指针(这显然是我们必须使用的 ROOT 包的要求):

std::vector<double> *m_jet_pt;

和指向直方图类的指针:

TH1F *h_jet_pt;

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

constructor()
{
  // this is data, will be associated to a TTree later
  m_jet_pt = 0;

  // this is a histogram
  h_jet_pt = new TH1F("name", "title", nbins, min_bin, max_bin); 
}

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

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 函数中循环调用,每个事件调用一次,然后您将进行所需的物理选择

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 个jets,30 个electron,30 个μon 等等,你可以看到这个数字是多少成员变量变得巨大!很快代码就变得一团糟,那么你们专业的程序员会如何处理这种情况呢?希望这已经足够清楚了!

最佳答案

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

一旦您创建了您的类的对象,它就可以与 TTree 上的顶级分支相关联:

tree->Branch(branchname, className, &p_object, bufsize, splitlevel)

有关详细信息,请参阅案例 B:https://root.cern.ch/doc/master/classTTree.html

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

关于c++ - 具有许多成员变量的类的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036285/

有关c++ - 具有许多成员变量的类的最佳实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  6. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  10. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

随机推荐