c++ - 使用重载构造函数时出现类型不完整错误

标签 c++

<分区>

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

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

代码如下:

模拟环境.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

模拟环境.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: 错误:字段“ClassContainingParams”的类型“SimEnv”不完整

ClassContainingSomeParams.hpp:5:1: 错误:'ClassContainingSomeParams' 没有命名类型

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

最佳答案

ClassContainingParams.hppSimEnv.hpp之间存在循环包含

ClassContainingParams 更改为 ClassContainingParams*const ClassContainingParams& 并将 ClassContainingParams.hpp 的包含移动到 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

模拟环境.cpp

#include <SimEnv.hpp>
#include <ClassContainingSomeParams.hpp>

namespace Namespace
{
    SimEnv::SimEnv(const ClassContainingSomeParams& p) : 
        p1(p.getP1()), p2(p.getP2())
    {
        init();
    }

    SimEnv(SimEnv(size_t p1, size_t p2) : p1(p1), p2(p2)
    {
        init();
    }

    void SimEnv::init()
    {
        std::cout << "I'm initialised" << '\n';
    }
}

关于c++ - 使用重载构造函数时出现类型不完整错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51399046/

相关文章:

c++ - VS2010中MFC模板项目的问题

c++ - : corrupted double-linked list 0xb2808cf8 C++ 错误

c++ - 用相同类型的对象覆盖对象

c++ - 具有中间变量的 Eigen 惰性评估

c++ - 在 Swift 项目中集成 Box2d 会出现找不到 cassert 文件的错误

c++ - SFML 渲染目标.draw : Invalid use of incomplete type

c++ - 循环类型定义

c++ - 开发嵌入式软件库,C 还是 C++?

C++:双指针的动态初始化

c++ - 根据返回值重载一个C++函数