[英]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.