簡體   English   中英

全局對象通過共享指針進行交互

[英]Global Object interacted with by shared pointers

因此,我一直在嘗試使用指向結構的Shared指針來保存程序中可以在狀態機中的狀態之間共享的所有數據。

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)

在構造函數中,我(忘記了:這里后面的術語)

std::cout << _data->x;

即使x在結構中定義為1,它也會向控制台輸出0。我運行此測試是因為嘗試時在Game.cpp中加載到_data-> assets的紋理超出了范圍(黑屏)將其引用到State_Splash.cpp中的sprite。

我的問題是,共享指針在做錯什么嗎? 還是有更好的方法為整個程序創建一些共享資源倉庫?

還是有更好的方法為整個程序創建一些共享資源倉庫?

單身人士的聲譽不好。 很多原因來自C ++ 11以前的時代,那時很難正確地解決它們。 C ++ 11使它們安全。 它也是一個全局對象-因此要考慮有關全局變量的所有注意事項。 應避免使用它們,除非它們可以使您的程序更好。

單例在游戲應用程序中工作得很好。 我只是創建類似GameContext singleton的東西,而忽略共享指針。 您的游戲數據在設計上是全局的。

但是,如果您的代碼設計為具有多個此類對象,則單例將對您不起作用。

單例或任何形式的全局都會破壞成分和可測試性。 這種事情幾乎從來沒有一個很好的理由。

最好使用依賴項注入。 然后,您可以僅使用依賴關系模型來測試游戲的組件。

#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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM