Общие указатели структуры для использования экземпляров обработчиков во всех файлах - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь создать игру, но у меня возникают трудности при попытке использовать один и тот же экземпляр других классов в других «обработчиках» (InputManager, Logger, AssetsManager и т. Д.). Это ошибки:

  • AssetManager.h (14,35): ошибка C2061: синтаксическая ошибка: идентификатор 'LogDataRef'
  • AssetManager.h (30,21): ошибка C3646: 'logdata': неизвестный спецификатор переопределения
  • AssetManager.h (30,21): ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int

Это мой основной заголовок игры, в котором я создаю экземпляры всех различных классов обработчиков

#pragma once
#include <iostream>

#include "SFML/Graphics.hpp"
#include "DEFINITIONS.h"

#include "AssetManager.h"
#include "StateMachine.h"
#include "LogSystem.h"
#include "FileParser.h"



namespace ME2D
{

    struct GameData {
        StateMachine machine;
        sf::RenderWindow window;
    };

    struct AssetData {
        AssetManager assetmanager;
    };

    struct LogData {
        LogSystem logger;
    };

    struct ParseData {
        FileParser parser;
    };

    typedef std::shared_ptr<GameData> GameDataRef;
    typedef std::shared_ptr<AssetData> AssetDataRef;
    typedef std::shared_ptr<LogData> LogDataRef;
    typedef std::shared_ptr<ParseData> ParseDataRef;

    class TDGame
    {
    public:
        TDGame();
    private:
        void Run();
    private:
        GameDataRef data = std::make_shared<GameData>();
        AssetDataRef assetdata = std::make_shared<AssetData>();
        LogDataRef logdata = std::make_shared<LogData>();
        ParseDataRef parsedata = std::make_shared<ParseData>();

        sf::Clock clock;

        const float dt = 1 / 60.f;
    };
}

Это файл заголовкадля класса AssetManager. Просто удалил общедоступные функции для экономии места (только базовые загрузчики и геттеры).

#pragma once
#include <iostream>
#include <map>
#include "SFML/Graphics.hpp"
#include "SFML/Audio.hpp"
#include "Block.h"
#include "2DGame.h"

namespace ME2D
{
    class AssetManager
    {
    public:
        // some functions here
    private:
        LogDataRef logdata;

        std::map<std::string, sf::Texture> mTextures;
        std::map<std::string, sf::Sprite> mSprites;
        std::map<std::string, sf::SoundBuffer> mSBuffers;
        std::map<std::string, sf::Sound> mSounds;
        std::map<std::string, ME2D::Block> mBlocks;
    };
}

Мне нужно использовать экземпляры в основном заголовке игры для других обработчиков. Для этого примера мне нужно использовать экземплярный класс журнала, который находится в заголовке игры внутри класса AssetsManager (конечно, мне нужно использовать его и в других обработчиках, поэтому он записывает всю зарегистрированную информацию в один файл вместо созданиянесколько экземпляров регистратора внутри каждого обработчика и создание нескольких файлов журналов).

Также стоит отметить, что я не имею ни малейшего представления о том, как работает shared_ptr или make_shared или что именно они делают, смотрел, как чувак делаетконечный автомат из видео YouTube (потому что я понятия не имею, как, а также стек, и эти вещи присутствовали на пути создания конечного автомата, который я, вероятно, смог понять в некоторой степени), и некоторая информация о них будетТакже очень цениться. По сути, я новичок, кодирую максимум 3 месяца, пытаюсь сделать свою первую игру и учусь в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...