使用重载的构造函数时,类型错误不完整

时间:2018-07-18 09:57:46

标签: c++

我添加了一个C ++类来帮助我运行模拟。一切正常,直到我添加了另一个具有不同初始化参数的构造函数,之后编译器抱怨以前使用的原始构造函数出现“不完整类型”错误。 CLion还抱怨找不到匹配的构造函数,即使它与我到目前为止一直使用的相同。

PS。我正在创建该类的2个单独实例(在main中创建1个实例,在main中也初始化另一个类中的1个实例)...不确定这是否是个问题?

代码如下:

SimEnv.hpp

#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

SimEnv.cpp

#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)
{}

ClassContainingSomeParams.hpp

#ifndef CLASSCONTAININGSOMEPARAMS
#define CLASSCONTAININGSOMEPARAMS
#include "SimEnv.hpp"

ClassContainingSomeParams
{
    public:
        ClassContainingSomeParams();
        void runSim();
        int getP1();
        int getP2();
    private:
        int p1, p2;
};

#endif

ClassContainingSomeParams.cpp

#include "ClassContainingSomeParams.hpp"

ClassContainingSomeParams::ClassContainingSomeParams() : p1(0), p2(0)
{}

void ClassContainingSomeParams::runSim()
{          
    SimEnv env(p1, p2);
    // Do some stuff
}

main.cpp

#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

我是否需要将类声明和初始化放入头文件中?如果是这样,为什么?

1 个答案:

答案 0 :(得分:2)

02 Caused by: 02 OpenSSL::Cipher::CipherError: key length too short ClassContainingParams.hpp之间有一个循环包含。

SimEnv.hpp更改为ClassContainingParamsClassContainingParams*,然后将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
相关问题