鱼C论坛

 找回密码
 立即注册
查看: 1404|回复: 3

[已解决]c++ 抱错 error: invalid use of incomplete type ‘class B1::HistoManager’

[复制链接]
发表于 2023-6-26 14:28:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在一个类里面调用另外一个类,我包含头文件了,怎么还报这个bug
在ActionInitialization.cc文件里面的build函数里面HistoManager* histo = new HistoManager();报错

ActionInitialization.cc文件
  1. #include "ActionInitialization.hh"
  2. #include "PrimaryGeneratorAction.hh"
  3. #include "RunAction.hh"
  4. #include "EventAction.hh"
  5. #include "SteppingAction.hh"

  6. #include "HistoManager.hh"

  7. namespace B1
  8. {

  9. ActionInitialization::ActionInitialization()
  10. {}


  11. ActionInitialization::~ActionInitialization()
  12. {}


  13. void ActionInitialization::Build() const
  14. {
  15.     // Histo manager
  16.     HistoManager* histo = new HistoManager();

  17.   SetUserAction(new PrimaryGeneratorAction);

  18.   RunAction* runAction = new RunAction(histo);
  19.   SetUserAction(runAction);

  20.   EventAction* eventAction = new EventAction(runAction,histo);
  21.   SetUserAction(eventAction);

  22.   SetUserAction(new SteppingAction(eventAction));

  23. }

  24. //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

  25. }
复制代码



ActionInitialization.hh文件
  1. #ifndef B1ActionInitialization_h
  2. #define B1ActionInitialization_h 1

  3. #include "G4VUserActionInitialization.hh"

  4. /// Action initialization class.
  5. class G4Run;
  6. class HistoManager;  //me

  7. namespace B1
  8. {

  9. class ActionInitialization : public G4VUserActionInitialization
  10. {
  11.   public:
  12.     ActionInitialization();
  13.     ~ActionInitialization() override;

  14.     void BuildForMaster() const override;
  15.     void Build() const override;
  16. };

  17. }

复制代码


HistoManager.hh文件
  1. #ifndef HistoManager_h
  2. #define HistoManager_h 1
  3. #include "G4AnalysisManager.hh"
  4. #include "globals.hh"
  5. //#include "g4root.hh”
  6. class HistoManager
  7. {
  8.   public:
  9.     HistoManager();
  10.    ~HistoManager();

  11.     void Book();
  12.     void Save();
  13.    
  14.     void FillHisto(G4int id, G4double e, G4double weight = 1.0);
  15.     void Normalize(G4int id, G4double fac);   

  16.     void FillNtuple(G4double EnergyAbs, G4double EnergyGap,
  17.                     G4double TrackLAbs, G4double TrackLGap);
  18.    
  19.     void PrintStatistic();        
  20.    
  21.   private:
  22.     G4bool fFactoryOn;   
  23. };


  24. #endif
复制代码



最佳答案
2023-6-26 19:41:28
猪猪虾 发表于 2023-6-26 19:33
您用过clion编译器吗,怎么生产.hh文件和.cc文件呢

CLion是一个流行的C++集成开发环境(IDE),它支持C++的各种标准,并且提供了很多用于代码开发的工具。在CLion中,创建.hh(头文件)和.cc(源文件)是很简单的。以下是步骤:

1. 在你的项目中,右键点击你想要添加新文件的位置。

2. 在弹出的菜单中,选择  New  ->  C++ Class 。 这将打开一个对话框来创建新的C++类。

3. 在对话框中,你可以指定新类的名称,类的类型(类、结构体、联合体、枚举),以及是否需要生成对应的头文件和源文件。输入你需要的信息后,点击  OK 。

4. CLion将为你生成新的.hh头文件和.cc源文件,并自动打开它们。

在默认情况下,CLion将生成.h和.cpp文件作为头文件和源文件的扩展名,如果你需要.hh和.cc作为扩展名,你可以在创建类时,类名后面添加.hh或.cc,比如你可以在类名栏中输入 MyClass.hh ,CLion就会为你生成MyClass.hh和MyClass.cc文件。

注意:如果你的项目已经有.cc和.hh文件,当你创建新的类时,CLion会自动使用这些扩展名。

如果你只想单独创建一个.hh或者.cc文件,而不是C++类,你可以选择  New  ->  File  ,然后输入你想要的文件名和扩展名。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-26 14:35:35 | 显示全部楼层
报错“invalid use of incomplete type”是因为在使用某个类的时候,编译器只看到了它的前向声明(forward declaration)而没有看到类的定义。在你的代码中,虽然你在 ActionInitialization.hh 文件中进行了 HistoManager 的前向声明,但是在 ActionInitialization.cc 文件中创建 HistoManager 对象时,编译器并没有找到 HistoManager 的定义。

原因可能是以下几种情况:

1.  HistoManager.hh 文件并没有被正确包含。请检查 HistoManager.hh 文件的路径是否正确,且该文件是否在 ActionInitialization.cc 所在的目录或指定的include路径下。

2. 在 HistoManager.hh 中的宏定义可能有冲突,导致该文件没有被正确包含。这可能是因为文件保护宏( #ifndef HistoManager_h , #define HistoManager_h , #endif )与其他地方的宏冲突。

3. 需要注意 HistoManager.hh 文件中的其他include文件(如"G4AnalysisManager.hh")是否能够正确找到和包含。

解决上述问题后,再试一下。如果还有问题,请继续提供更多的信息。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-26 19:33:49 | 显示全部楼层
isdkz 发表于 2023-6-26 14:35
报错“invalid use of incomplete type”是因为在使用某个类的时候,编译器只看到了它的前向声明(forward  ...


您用过clion编译器吗,怎么生产.hh文件和.cc文件呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-26 19:41:28 | 显示全部楼层    本楼为最佳答案   
猪猪虾 发表于 2023-6-26 19:33
您用过clion编译器吗,怎么生产.hh文件和.cc文件呢

CLion是一个流行的C++集成开发环境(IDE),它支持C++的各种标准,并且提供了很多用于代码开发的工具。在CLion中,创建.hh(头文件)和.cc(源文件)是很简单的。以下是步骤:

1. 在你的项目中,右键点击你想要添加新文件的位置。

2. 在弹出的菜单中,选择  New  ->  C++ Class 。 这将打开一个对话框来创建新的C++类。

3. 在对话框中,你可以指定新类的名称,类的类型(类、结构体、联合体、枚举),以及是否需要生成对应的头文件和源文件。输入你需要的信息后,点击  OK 。

4. CLion将为你生成新的.hh头文件和.cc源文件,并自动打开它们。

在默认情况下,CLion将生成.h和.cpp文件作为头文件和源文件的扩展名,如果你需要.hh和.cc作为扩展名,你可以在创建类时,类名后面添加.hh或.cc,比如你可以在类名栏中输入 MyClass.hh ,CLion就会为你生成MyClass.hh和MyClass.cc文件。

注意:如果你的项目已经有.cc和.hh文件,当你创建新的类时,CLion会自动使用这些扩展名。

如果你只想单独创建一个.hh或者.cc文件,而不是C++类,你可以选择  New  ->  File  ,然后输入你想要的文件名和扩展名。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 11:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表