回答某一个同学Geant4问题

文|梁佐佐

一:

要想熟练得使用Geant4,C++的基本知识是要掌握的,其学习参考教材可任意选,刚入门的同学推荐比较薄的谭浩强版本《C++面向对象程序设计》,网上资源也丰富,比如:https://blog.csdn.net/zdh1995/article/details/78215863,一个星期左右就能把基础知识了解的差不多,然后再买本C++ primer(白皮的)有时间就慢慢看。在C++中,类/对象可以看作是一种带有很多自定义函数的数据类型(像int,double等),这个概念本身简洁,但需要啃一啃C++基础知识才印象深刻。类是一种特殊的类型,带有成员函数,成员变量(某一C++大佬是这么官方解释的)。

好啦,让我们回到要解决的问题本身,“为什么我在B1SteppingAction.hh中已经定义了fEventAction这个变量,但却无法在B1SteppingAction.cc中正常使用fEventAction ->AddEdep()函数?”。

解决方案是:

1.   在B1SteppingAction.hh中定义fEventAction这个变量,注意fEventAction的数据类型是B1EventAction;

2.     在直接定义fEventAction这个对象指针的类(B1EventAction.hh)中,声明AddEdep()这个函数。

用C++的语法解释分析这个问题,答案是:

1. fEventAction->AddEdep(),表明fEventAction是某一个对象(B1EventAction)的指针,而AddEdep()是该对象中声明的一个public函数;

2.B1SteppingAction.hh中声明fEventAction时,一定要先囊括B1EventAction这个对象/类,然后在private:中定义fEventAction,即B1EventAction*fEventAction;

3.  在B1EventAction.hh中,声明定义AddEdep()这个函数。

Geant4中具体的代码表现为:


总结来看这个问题:1)在调用某个对象指针的函数功能时,确保该对象指针的声明是合理的;2)G4中,SteppingAction中可以调用EventAction中的函数或变量,而EventAction中可以调用RunAction中的函数变量,即细节上的信息总是统计给上一级的没那么细节的目标,具体的调用关系参见往期教程。

另外,Geant4.9.6版本与Geant4.10往后的版本相比较,最明显的改动是4.10后的“多线程RunManager”和4.10后的#include"G4SystemOfUnits.hh"。

二:

Geant4的学习入门,两三个月是需要的,熟练掌握B1例子至关重要,包括其中涉及的基本C++语法。然后过了这个阶段后,就需要考虑怎样发挥主观能动性去干实际的项目?通常的途径包括:1)找学长学姐要往届的例子;2)学会谷歌检索(关键词当然得英文),此公众号后台回复“学术”即可获得教程,真是无比感谢那些无偿作技术分享的人;3)多看Geant4自带的例子。

ROOT同样是开源的数据分析工具,题主目前尝试用ROOT画一遍常见的SCI论文数据插图,并将于今年年底前发送全部例子和代码。ROOT的学习套路与G4一模一样,大家坚持。


喜欢的话,分享一下吧~^o^~
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,611评论 0 1
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,480评论 0 35
  • 苹果官方文档翻译 《Objective-C语言编程》(Programming with Objective-C) ...
    fever105阅读 26,023评论 19 129
  • 读过那么多序言,还是最喜欢黑塞在《德米安》里的这一篇序。很真,越读越喜欢。 序里写道: 「每个人的生命代表一条通往...
    姑娘你很有前途耶阅读 395评论 0 0
  • 2018-09-22 事件:与金六董事会的程远沟通,鼓励大家都说真话;彼此坦诚表达。 感受: 我的感受:平静、轻松...
    老龙_8457阅读 97评论 0 0