Итак, я видел этот вопрос, но предоставленные примеры были чрезвычайно простыми (их классы не имели конструкторов или методов), и я не знаю, как расширить решения для более сложный случай.C++: Включая файлы заголовков друг в друга
Я попытался использовать форвардные декларации и указатели, только декларации вперед, только указатели и даже декларации переходов и определения имен типов, все из которых были предложены решения других простых сообщений и ни один из них не работал (неизвестный идентификатор или неполный типа). Итак, как я могу получить два файла ниже для правильной компиляции и использовать их по своему усмотрению?
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
это может оказаться весьма полезным для первой работы, как это сделать, когда положить оба класса в один * * заголовочный файл. – Hurkyl
Не мог бы я решить ту же проблему? Если бы я сделал прямое объявление GridNode, затем определил Unit, а затем полностью определил GridNode, я бы получил еще одну ошибку неполного типа, когда я пытаюсь вызвать какой-либо конструктор GridNode, не так ли? – rawa
Да, все равно будут проблемы, но с раздельными заголовками, особенно с круговыми включениями, вводится еще больше осложнений; разработка, как исправить это, будет проще, если вы решите каждый набор проблем самостоятельно. – Hurkyl