我添加了一个C ++类来帮助我运行模拟。一切正常,直到我添加了另一个具有不同初始化参数的构造函数,之后编译器抱怨以前使用的原始构造函数出现“不完整类型”错误。 CLion还抱怨找不到匹配的构造函数,即使它与我到目前为止一直使用的相同。
PS。我正在创建该类的2个单独实例(在main中创建1个实例,在main中也初始化另一个类中的1个实例)...不确定这是否是个问题?
代码如下:
#ifndef SIMENV
#define SIMENV
#include "ClassContainingSomeParams.hpp"
class SimEnv
{
private:
int p1, p2;
public:
SimEnv(ClassContainingParams); // This is the bad constructor
SimEnv(int, int);
};
#endif
#include "SimEnv.hpp"
/* This is the bad constructor */
SimEnv::SimEnv(ClassContainingSomeParams p) :
p1(p.getP1()), p2(p.getP2())
{}
SimEnv(SimEnv(int p1, int p2) : p1(p1), p2(p2)
{}
#ifndef CLASSCONTAININGSOMEPARAMS
#define CLASSCONTAININGSOMEPARAMS
#include "SimEnv.hpp"
ClassContainingSomeParams
{
public:
ClassContainingSomeParams();
void runSim();
int getP1();
int getP2();
private:
int p1, p2;
};
#endif
#include "ClassContainingSomeParams.hpp"
ClassContainingSomeParams::ClassContainingSomeParams() : p1(0), p2(0)
{}
void ClassContainingSomeParams::runSim()
{
SimEnv env(p1, p2);
// Do some stuff
}
#include "ClassContainingSomeParams.hpp"
#include "SimEnv.hpp"
int main()
{
ClassContainingSomeParams p;
SimEnv env(p);
// Do some stuff
return 0;
}
我得到的确切错误是
SimEnv.hpp:10:33: error: field 'ClassContainingParams' has incomplete type 'SimEnv'
ClassContainingSomeParams.hpp:5:1: error: 'ClassContainingSomeParams' does not name a type
我是否需要将类声明和初始化放入头文件中?如果是这样,为什么?
答案 0 :(得分:2)
02 Caused by:
02 OpenSSL::Cipher::CipherError: key length too short
和ClassContainingParams.hpp
之间有一个循环包含。
将SimEnv.hpp
更改为ClassContainingParams
或ClassContainingParams*
,然后将const ClassContainingParams&
的包含内容移到ClassContainingParams.hpp
中。
SimEnv.cpp
SimEnv.cpp
#ifndef SIMENV
#define SIMENV
class ClassContainingSomeParams;
namespace Namespace
{
class SimEnv
{
private:
size_t p1, p2;
size_t* pTracker;
void init();
public:
SimEnv(const ClassContainingParams&);
SimEnv(size_t, size_t);
size_t func1();
size_t func2();
};
}
#endif