Как решить циклические ссылки модулей c++
Возникла такая проблема. Есть 2 класса, разнесенные по разным "модулям". В классе GameField есть поле Platform platform. А в классе Platform используется статическое поле класса GameField. То есть задумка такова, что в одном классе объекты поля, а другой класс - один из объектов. И, соответственно, возникает зацикливание с ошибкой в строке Platform platform класса GameField(C3646 platform: неизвестный спецификатор переопределения, C4430 отсутствует спецификатор типа - предполагается int. C++ не поддерживает int по умолчанию). В похожем вопросе было предложено использовать ссылку на класс, но в моем случае это безрезультатно, если я только правильно сделал :) Прилагаю код двух модулей и скрин попытки решения через ссылку на класс(P.S через ссылку не видит члены класса).
GameField.h:
#pragma once
#include <vector>
#include "level.h"
#include "Platform.h"
#include <list>
#include <SFML/Audio.hpp>
#include "Images.h"
class GameField
{
public:
static std::vector<Object> solidInvisibleobj;
Platform platform;
static Level level;
GameField(std::vector<Object>& solidInvisibleobj, float X, float Y);
void pushSolidInvisibleobj(std::vector<Object>& solidInvisibleobj);
};
GameField.cpp:
#include "GameField.h"
GameField::GameField(std::vector<Object>& solidInvisibleobj, float X, float Y)
{
GameField::pushSolidInvisibleobj(GameField::solidInvisibleobj);
Images::loadImages();
platform = Platform(0,0.3,Images::playerImg,"Platform",X,Y,95,22);
}
void GameField::pushSolidInvisibleobj(std::vector<Object>& solidInvisibleobj)
{
solidInvisibleobj = level.GetObjects("solid");
}
Platform.h:
#pragma once
#include "Entity.h"
#include "GameField.h"
#include "view.h"
class Platform :public Entity
{
public:
float dx, moveSpeed;
static enum stateObject {left, right, stay};
stateObject state;
Platform();
Platform(float dx, float moveSpeed, Image image, String Name, float x, float y, int w, int h);
void control(float time);
void checkCollisionWithMap(float dx);
};
Platform.cpp:
#include "Platform.h"
Platform::Platform(float dx, float moveSpeed, Image image, String Name, float x, float y, int w, int h):Entity(image,Name,x,y,w,h)
{
this->dx = dx;
this->moveSpeed = moveSpeed;
this->state = stay;
}
Platform::Platform() {
}
void Platform::checkCollisionWithMap(float dx)
{
// Обход всех объектов карты
for (int i = 0; i < GameField::solidInvisibleobj.size(); i++)
// При пересечении г.г и объектов карты
if (getRect().intersects(GameField::solidInvisibleobj[i].rect))
{
// Выталкивание персонажа из текстуры
if (GameField::solidInvisibleobj[i].name == "solid") // || obj[i].name == "transporterR" || obj[i].name == "transporterL"
{
//if (dx > 0) { y = [i].rect.top - h; moveY = 0; onGround = true; }
//if (Dy < 0) { y = obj[i].rect.top + obj[i].rect.height; moveY = 0; }
if (dx > 0) { x = GameField::solidInvisibleobj[i].rect.left - w; }
if (dx < 0) { x = GameField::solidInvisibleobj[i].rect.left + GameField::solidInvisibleobj[i].rect.width; }
}
/* // Передвижение г.г при пересечении с конвеерами
if (obj[i].name == "transporterR")
{
collisTransporterR = true;
}
else
{
collisTransporterR = false;
}
if (obj[i].name == "transporterL")
{
collisTransporterL = true;
}
else
{
collisTransporterL = false;
}
if ((obj[i].name == "JumpPlatform") && (moveY > 0) && (onGround == false))
{
moveY = -0.8;
}
if (obj[i].name == "deathItem")
health = 0;
if (obj[i].name == "Exit")
GoNextLevel = true;
*/
}
}
void Platform::control(float time)
{
// При нажатии клавиши движения влево
if ((Keyboard::isKeyPressed(Keyboard::A)))
{
// Обновление состояния
state = left;
}
// При нажатии клавиши движения вправо
if (Keyboard::isKeyPressed(Keyboard::D))
{
state = right;
}
// При отсутствии движения
if (!(Keyboard::isKeyPressed(Keyboard::A)) && !(Keyboard::isKeyPressed(Keyboard::D)))
{
state = stay;
}
switch (state)
{
case Platform::left: dx = -moveSpeed;
break;
case Platform::right:dx = moveSpeed;
break;
case Platform::stay: dx = 0;
break;
};
x += dx * time;
checkCollisionWithMap(Platform::dx);
sprite.setPosition(x + w / 2, y + h / 2);
//setCoordToView(x, y);
}

