c++ - 如何让非全局对象在函数内进行交互?

标签 c++ oop object

我正在尝试使用 C++ 创建 Breakout 克隆,因此有几个对象(如球、桨、powerupicon、 block 等)。我知道将它们放在全局范围内是不好的做法,因此它们在 main() 中初始化。问题在于需要从其他函数(如 redraw() 或 reset_game())内部对这些对象进行操作。我能想到的唯一方法是将对象的引用传递给每个函数,但我不确定这是否是最佳方法。

基本上,在函数内处理这些对象的最佳方式是什么?通过引用传递它们?使它们成为全局但在命名空间内?还是完全不同的东西?

最佳答案

一种简单(不一定灵活或强大)的方法是定义一个基 game_object 类,该类定义您与游戏对象的接口(interface),并存储它们。你的对象继承自它。:

class game_object
{
public:
    virtual ~game_object() {}

    virtual void update() = 0;
    virtual void draw() = 0;

    // get and set position
    virtual vector3 position() = 0;
    virtual void position(const vector3&) = 0;

    // etc...
};

class ball : public game_object
{
public:
    void update() { /* update the ball */ }
    void draw() { /* draw the ball */ }

    // etc
};

// etc

现在您有了使用游戏对象的通用方法。接下来,您可以将它们存储在 map 中(如果您有 Boost、TR1 或 C++0x,最好是 unordered_map),并使该 map 全局可用:

// game_object_manager.h
typedef std::map<std::string, game_object*> game_object_manager;

extern game_object_manager manager;

您在某处的翻译单元(main.cppgame_object_manager.cpp)中定义它。最后,您可以通过按名称插入内容来使用它:

// somewhere, add the ball
manager.insert(std::make_pair("ball", new ball()));

并使用它:

game_object* b = manager["ball"];
if (!b) /* there is no ball object */

// use b as ball */

同样,这是一个简单的解决方案,不一定稳健、最佳实践或灵活。但对于第一场比赛,它会运作良好。 (要改进它,您需要研究异常安全、智能指针和其他东西(游戏书籍)。我建议您在尝试制作游戏之前这样做。)

关于c++ - 如何让非全局对象在函数内进行交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3691861/

相关文章:

python - 如何在不清除背景的情况下弹出 ncurses 小部件?

c++ - 无法让 BOOST odeint 与 Adams-Bashforth-Moulton 一起工作

c++ - 尝试在基类之外创建派生类的实例时出错

c# - 与泛型建立关系

javascript - 在javascript中的对象中创建方法

python - 如何创建一个包含 python 对象的所有字段和属性的字典?

javascript - Nodejs 响应的第二级对象出错

C++ 无意义的表达式填充

php - Zend Framework 如何优化模型?

c++ - std::chrono::duration_cast - 有比纳秒更精确的单位吗?