首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过共享指针与全局对象交互

通过共享指针与全局对象交互
EN

Stack Overflow用户
提问于 2017-08-05 15:09:27
回答 2查看 287关注 0票数 0

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

代码语言:javascript
复制
struct GameData
{
    StateMachine machine;
    sf::RenderWindow window;
    AssetManager assets;
    InputManger input;
    const int x = 1;
};

typedef std::shared_ptr<GameData> GameDataRef;

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

代码语言:javascript
复制
GameDataRef _data = std::make_shared<GameData>();

在我的game.cpp文件中,如果我理解正确的话,make_shared会创建对象并将名为_data的shared_ptr分配给它。

代码语言:javascript
复制
StateRef _splash = std::make_unique<State_Splash>(_data);

这是创建游戏开始时的基本状态的代码行。除了将共享指针作为参数之外,不要关心其他任何部分。

代码语言:javascript
复制
GameDataRef _data;

我在State_Splash.cpp中创建了另一个名为_data的共享指针

代码语言:javascript
复制
State_Splash::State_Splash(GameDataRef GDR) : _data(GDR)

在构造函数中,我(忘记了后面的术语: here)

代码语言:javascript
复制
std::cout << _data->x;

这会将0输出到控制台,即使x在结构中定义为1。我之所以运行此测试,是因为当我试图在State_Splash.cpp中引用sprite时,加载到Game.cpp中的_data->assets中的纹理超出了范围(空白白屏)。

我的问题是,我是不是在共享指针方面做错了什么?或者,有没有更好的方法来为整个程序创建一些共享资源库?

EN

回答 2

Stack Overflow用户

发布于 2017-08-05 16:15:54

或者有没有更好的方法来为整个程序创建一些共享资源库?

单身人士的名声不好。其中很多都来自于C++11之前的时代,当时很难把它们写对。C++11使它们变得安全。它也是一个全局对象--所以它受到关于全局变量的所有考虑。除非它们能让你的程序变得更好,否则应该避免它们。

单例在游戏应用程序中工作得很好。我只是创建了像GameContext singleton这样的东西,而忘记了共享指针。您的游戏数据在设计上是全局的。

然而,如果你的代码被设计成有多个这样的对象,那么单例就不适合你了。

票数 0
EN

Stack Overflow用户

发布于 2017-08-05 16:50:14

任何类型的单例或全局都会破坏组合和可测试性。对于这样的事情,几乎从来没有一个好的理由。

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

代码语言:javascript
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45519274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档