Как решить циклические ссылки модулей 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);
}

Скрины попыток решения: введите сюда описание изображения

введите сюда описание изображения


Ответы (0 шт):