鱼C论坛

 找回密码
 立即注册
查看: 490|回复: 4

[已解决]c++ ,prototype问题,申明和使用不匹配?

[复制链接]
发表于 2023-7-24 22:50:23 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 猪猪虾 于 2023-7-24 22:54 编辑

捕获.JPG
//
/// \file ActionInitialization.hh
/// \brief Definition of the B3b::ActionInitialization class

#ifndef B3bActionInitialization_h
#define B3bActionInitialization_h 1

#include "G4VUserActionInitialization.hh"

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
namespace B3
{
    class DetectorConstruction;
}

namespace B3b
{

/// Action initialization class.

class ActionInitialization : public G4VUserActionInitialization
{
  public:
    ActionInitialization(B3::DetectorConstruction* detConstruction);
    ~ActionInitialization() override;

    void BuildForMaster() const override;
    void Build() const override;

private:
    B3::DetectorConstruction* fdetectorConstruction = nullptr;
};

}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

#endif
//
/// \file ActionInitialization.cc
/// \brief Implementation of the B3b::ActionInitialization class

#include "ActionInitialization.hh"
#include "RunAction.hh"
#include "PrimaryGeneratorAction.hh"
#include "StackingAction.hh"
#include "PrimaryGeneratorAction.hh"
#include "DetectorConstruction.hh"
#include "Run.hh"
using namespace B3;

namespace B3b
{

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
ActionInitialization::ActionInitialization(DetectorConstruction* detConstruction)
:fdetectorConstruction(detConstruction)
{}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

ActionInitialization::~ActionInitialization()
{}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

void ActionInitialization::BuildForMaster() const
{
  SetUserAction(new RunAction);
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

void ActionInitialization::Build() const
{

  SetUserAction(new RunAction);
  SetUserAction(new PrimaryGeneratorAction(fdetectorConstruction));
  SetUserAction(new StackingAction);
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

}


#endif
最佳答案
2023-7-24 22:50:39
从你提供的错误信息来看,问题出在 ActionInitialization 类的构造函数声明和定义不匹配。

根据错误信息,构造函数的原型(声明)是 ActionInitialization::ActionInitialization(B3b::DetectorConstruction*),但在类的定义中,构造函数是 ActionInitialization::ActionInitialization(DetectorConstruction* detConstruction)

错误的原因可能是类 B3b::DetectorConstruction 的前缀被遗漏或者参数名称不匹配。为了解决这个问题,你需要做以下步骤:

1. 确保在构造函数的声明和定义中使用相同的类名作为参数类型。检查 DetectorConstruction 类的前缀是否为 B3b::
2. 检查参数名称是否一致,包括大小写。确保在构造函数的声明和定义中使用相同的参数名称。

下面是一个示例,展示如何修正构造函数声明和定义的不匹配问题:
// 在声明中添加正确的前缀 'B3b::'
ActionInitialization::ActionInitialization(B3b::DetectorConstruction* detConstruction);

// 在定义中使用相同的参数类型和名称
ActionInitialization::ActionInitialization(B3b::DetectorConstruction* detConstruction) {
    // 构造函数的实现代码
}

请根据实际情况检查和修改构造函数的声明和定义,确保它们匹配并且编译通过。

希望这个回答对你有所帮助。如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-24 22:50:35 | 显示全部楼层
这个错误提示是因为您在类 B3b::ActionInitialization 的构造函数声明中的参数类型与定义的不一致导致的。以下是解决该问题的具体步骤:

1. 在类 B3b::ActionInitialization 的声明中,找到构造函数的原型声明。应该类似于:
   ActionInitialization(DetectorConstruction* detConstruction);   
2. 确保在类的定义部分中,构造函数的定义与原型声明一致。可以修改为:
   B3b::ActionInitialization::ActionInitialization(DetectorConstruction* detConstruction) {       // 构造函数的具体实现   }   
请注意,如果 B3b::ActionInitialization 类的构造函数已经在其他地方进行了定义,那么可能会出现重复定义的错误。此时,您需要确保只有一个正确的构造函数定义。

希望这些步骤能够帮助您解决问题。如果您还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 22:50:39 | 显示全部楼层    本楼为最佳答案   
从你提供的错误信息来看,问题出在 ActionInitialization 类的构造函数声明和定义不匹配。

根据错误信息,构造函数的原型(声明)是 ActionInitialization::ActionInitialization(B3b::DetectorConstruction*),但在类的定义中,构造函数是 ActionInitialization::ActionInitialization(DetectorConstruction* detConstruction)

错误的原因可能是类 B3b::DetectorConstruction 的前缀被遗漏或者参数名称不匹配。为了解决这个问题,你需要做以下步骤:

1. 确保在构造函数的声明和定义中使用相同的类名作为参数类型。检查 DetectorConstruction 类的前缀是否为 B3b::
2. 检查参数名称是否一致,包括大小写。确保在构造函数的声明和定义中使用相同的参数名称。

下面是一个示例,展示如何修正构造函数声明和定义的不匹配问题:
// 在声明中添加正确的前缀 'B3b::'
ActionInitialization::ActionInitialization(B3b::DetectorConstruction* detConstruction);

// 在定义中使用相同的参数类型和名称
ActionInitialization::ActionInitialization(B3b::DetectorConstruction* detConstruction) {
    // 构造函数的实现代码
}

请根据实际情况检查和修改构造函数的声明和定义,确保它们匹配并且编译通过。

希望这个回答对你有所帮助。如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 22:50:56 | 显示全部楼层
从你的错误消息来看,问题出在 B3b::ActionInitialization::ActionInitialization(B3b::DetectorConstruction*) 的声明和实现不匹配。在C++中,函数的原型(prototype)需要在头文件(.h或.hpp)中声明,在源文件(.cpp)中实现,并且两者的签名(即返回类型,函数名和参数列表)必须完全一致。

针对您的问题,一种可能的情况是,你在头文件中声明的 ActionInitialization 构造函数可能并没有接受一个指向 B3b::DetectorConstruction 的指针的参数。然后在实现时,你却提供了这个参数。

所以,你需要检查一下你的头文件和源文件,确认两者的声明和实现是否完全匹配。具体来说,应该是这样的:

在你的头文件中(假设是 ActionInitialization.h ):
namespace B3b {
    class DetectorConstruction;
    
    class ActionInitialization {
    public:
        ActionInitialization(DetectorConstruction* detConstruction);
        // 其他的成员函数和变量...
    };
}

然后在你的源文件中(假设是 ActionInitialization.cpp ):
#include "ActionInitialization.h"
#include "DetectorConstruction.h"

B3b::ActionInitialization::ActionInitialization(DetectorConstruction* detConstruction) {
    // 函数体...
}

希望这个解答可以帮助你解决问题,如果还有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 22:58:09 | 显示全部楼层
抵制AI
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 11:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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