C ++:将头文件包含在一起

时间:2015-07-03 22:12:36

标签: c++ header-files

所以我已经看到了这个问题,但人们提供的例子非常简单(他们的课程没有构造函数或方法),我也不知道如何将解决方案扩展到更复杂的案例。

我尝试过使用前向声明和指针,只是前向声明,只是指针,甚至前向声明和类型名称定义,所有这些都是来自其他更简单的帖子的建议解决方案,但没有一个有效(未知标识符或不完整类型)错误)。那么我如何才能使下面的两个文件正确编译并按照我的意图使用?

Unit.hpp:

#ifndef PROJECT_UNIT_HPP
#define PROJECT_UNIT_HPP

#include "GridNode.hpp"

class Unit
{
private:
    /* Fields */
    int xPos, yPos, ownerID;
    std::vector<GridNode> influenceMap;

public:
    /* Constructors */
    Unit(int x, int y, int id) : xPos(x), yPos(y), ownerID(id)
    {
        influenceMap.push_back( GridNode() );
    }

    /* Methods */
    std::vector<GridNode> getMap() {return influenceMap;}
};

#endif

GridNode.hpp:

#ifndef PROJECT_GRIDNODE_HPP
#define PROJECT_GRIDNODE_HPP

#include "Unit.hpp"

class GridNode
{
private:
    /* Members */
    int id;
    std::vector<Unit> nodeUnits;

public:
    /* Static vars */
    static int nodeLength;

    /* Constructors */
    GridNode()
    {
        std::cout << "Reached here!\n";
    }
};

#endif

2 个答案:

答案 0 :(得分:2)

您需要做的就是#include <vector>中的class Unit;GridNode.hpp中的前向声明#ifndef PROJECT_GRIDNODE_HPP #define PROJECT_GRIDNODE_HPP // using std::vector #include <vector> // Forward declare class Unit; class GridNode { private: /* Members */ int id; std::vector<Unit> nodeUnits; public: /* Static vars */ static int nodeLength; /* Constructors */ GridNode() { std::cout << "Reached here!\n"; } }; #endif

def create_callable_for(i):
    def f():
        print("hello",i)
    return f

for i in range(22):
   m.addAction('Menu '+str(i), create_callable_for(i))

答案 1 :(得分:1)

您需要转发声明和将成员函数体(包括构造函数和析构函数)移出类体,并在包含其他类定义之后。

即使是隐式构造函数和析构函数也会破坏,你需要显式的用户提供的声明(尽管你可以通过= default使用编译器提供的定义)

class GridNode;
class Unit
{
private:
    /* Fields */
    int xPos, yPos, ownerID;
    std::vector<GridNode> influenceMap;

public:
    /* Constructors */
    Unit(int x, int y, int id);
    Unit(const Unit&);
   ~Unit();

    /* Methods */
    std::vector<GridNode> getMap();
};

#include "GridNode.hpp"

inline Unit::Unit(int x, int y, int id) : xPos(x), yPos(y), ownerID(id)
{
    influenceMap.push_back( GridNode() );
}

inline Unit::Unit(const Unit&) = default;

inline Unit::~Unit() = default;

inline std::vector<GridNode> Unit::getMap() {return influenceMap;}