Я пытаюсь создать игру, но у меня возникают трудности при попытке использовать один и тот же экземпляр других классов в других «обработчиках» (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 месяца, пытаюсь сделать свою первую игру и учусь в процессе.