全局对象通过共享指针进行交互

时间:2017-08-05 07:09:27

标签: c++ constructor arguments shared-ptr sfml

所以,我一直在尝试使用一个指向结构的共享指针来保存我的程序中可以在状态机中的状态之间共享的所有数据。

struct GameData
{
    StateMachine machine;
    sf::RenderWindow window;
    AssetManager assets;
    InputManger input;
    const int x = 1;
};

typedef std::shared_ptr<GameData> GameDataRef;

这是一个仅提供共享数据资源之间接口的文件。叫GameData.cpp

GameDataRef _data = std::make_shared<GameData>();

在我的game.cpp文件中,如果我理解正确,make_shared会创建对象并为其指定名为_data的shared_ptr

StateRef _splash = std::make_unique<State_Splash>(_data);

这是创建基本状态以启动游戏的行。别担心除了它之外的任何部分都将共享指针作为参数。

GameDataRef _data;

我在State_Splash.cpp中创建另一个名为_data

的共享指针
State_Splash::State_Splash(GameDataRef GDR) : _data(GDR)

在构造函数中,我(忘记了以下内容的术语:here)

std::cout << _data->x;

这会将0打印到控制台,即使x在结构中定义为1.我运行此测试,因为我在Game.cpp中加载到_data-&gt;资产中的纹理超出了范围(空白屏幕)当我试图将它引用到State_Splash.cpp中的精灵时。

我的问题是,我是否在使用共享指针时出错?或者是否有更好的方法为整个程序制作一些共享资源库?

2 个答案:

答案 0 :(得分:0)

  
    

或者是否有更好的方法为整个程序制作一些共享资源库?

  

单身人士声名狼借。很多它来自于前C ++ 11时代,很难让它们正确。 C ++ 11使它们安全。它也是一个全局对象 - 因此它受全局因素的影响。应该避免使用它们,除非它们使程序更好。

Singletons在游戏应用程序中运作良好。我只是创建类似GameContext单例的东西而忘记共享指针。您的游戏数据是全球性的。

但是,如果您的代码设计为具有多个此类对象,则单例将不适合您。

答案 1 :(得分:0)

任何类型的单身或全球都会破坏构图和可测试性。这种事情几乎没有充分的理由。

最好使用依赖注入。然后,您可以仅使用依赖关系模型来测试游戏的组件。

#include <vector>

struct StateMachine{};
namespace sf { struct RenderWindow {}; }
struct AssetManager {};
struct InputManager {};

struct GameData
{
    StateMachine machine;
    sf::RenderWindow window;
    AssetManager assets;
    InputManager input;
    const int x = 1;
};

struct action {};
std::vector<action> checkInputs(InputManager&);

void runGame(GameData& gameData)
{
    while (1) {
        auto inputActions = checkInputs(gameData.input);
    }

}

int main()
{
    GameData gameData;

    runGame(gameData);
}