代码之家  ›  专栏  ›  技术社区  ›  Yassie

使用重载构造函数时出现不完整类型错误[已关闭]

c++
  •  0
  • Yassie  · 技术社区  · 8 年前

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

    我正在创建两个独立的类实例(一个在main中,另一个在main中也初始化了一个类)…不确定这是否是一个问题?

    代码如下:

    西门子水电站

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

    类包含omeparams.hpp

    #ifndef CLASSCONTAININGSOMEPARAMS
    #define CLASSCONTAININGSOMEPARAMS
    #include "SimEnv.hpp"
    
    ClassContainingSomeParams
    {
        public:
            ClassContainingSomeParams();
            void runSim();
            int getP1();
            int getP2();
        private:
            int p1, p2;
    };
    
    #endif
    

    包含omeparams.cpp的类

    #include "ClassContainingSomeParams.hpp"
    
    ClassContainingSomeParams::ClassContainingSomeParams() : p1(0), p2(0)
    {}
    
    void ClassContainingSomeParams::runSim()
    {          
        SimEnv env(p1, p2);
        // Do some stuff
    }
    

    主.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 回复  |  直到 8 年前
        1
  •  2
  •   Moia    8 年前

    在 ClassContainingParams.hpp 和 SimEnv.hpp 是的。

    改变你的 ClassContainingParams 到 ClassContainingParams* 或 const ClassContainingParams& 并移动包含 类包含params.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
    

    simenv.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';
        }
    }