猪猪虾 发表于 2023-7-24 22:50:23

c++ ,prototype问题,申明和使用不匹配?

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



//
/// \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

Mike_python小 发表于 2023-7-24 22:50:35

这个错误提示是因为您在类 B3b::ActionInitialization 的构造函数声明中的参数类型与定义的不一致导致的。以下是解决该问题的具体步骤:

1. 在类 B3b::ActionInitialization 的声明中,找到构造函数的原型声明。应该类似于:
   
   ActionInitialization(DetectorConstruction* detConstruction);
   

2. 确保在类的定义部分中,构造函数的定义与原型声明一致。可以修改为:
   
   B3b::ActionInitialization::ActionInitialization(DetectorConstruction* detConstruction) {
       // 构造函数的具体实现
   }
   

请注意,如果 B3b::ActionInitialization 类的构造函数已经在其他地方进行了定义,那么可能会出现重复定义的错误。此时,您需要确保只有一个正确的构造函数定义。

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 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) {
    // 构造函数的实现代码
}


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

希望这个回答对你有所帮助。如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

isdkz 发表于 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) {
    // 函数体...
}


希望这个解答可以帮助你解决问题,如果还有其他问题,欢迎继续提问。

歌者文明清理员 发表于 2023-7-24 22:58:09

抵制AI
页: [1]
查看完整版本: c++ ,prototype问题,申明和使用不匹配?