使用全局变量来保持窗口尺寸的值

时间:2014-03-24 04:56:04

标签: c++ qt oop global-variables

我使用Qt对游戏进行编程,我想到了一个问题。我需要跟踪主窗口的尺寸,并且几个对象需要知道这些值(碰撞检测器,设置处理程序,窗口本身等)。在运行期间可以更改尺寸非常重要。

在这种情况下使用全局变量是不好的做法吗?这个问题的优秀设计解决方案是什么?使用类构造函数通过引用传递这些值会很痛苦。

3 个答案:

答案 0 :(得分:2)

窗口尺寸是窗口的属性,由Qt提供。您不需要“保留”它们的值,只需访问适当窗口的大小。

当然有助于抽象出一个能够保持游戏状态的基础对象。然后简单地将大小更改从窗口转发到该基础对象。它可以像下面这样简单:

class GameView : public QWidget {
  typedef QWidget base_class;
  GameState * m_state;
public:
  GameView(GameState * state, QWidget * parent = 0) : m_state(state), QWidget(parent) {
    m_state->setSize(size());
  }
protected:
  void resizeEvent(QResizeEvent * ev) {
    m_state->setSize(size());
    base_class::resizeEvent(ev);
  }
};

然后,游戏状态对象可以通知相关子对象有关更改(碰撞检测器等)。

答案 1 :(得分:1)

全局变量一直是设计不良和缺乏脱钩的症状。那是你真正的问题。如果您以后需要修改任何这些全局变量或者它们的用途,那么必须更改几个不同的类才能适应这些变量。我们必须更详细地看到你的设计才能恰当地批评它,但这就是它的要点。

答案 2 :(得分:0)

我并不熟悉Qt,但我对C ++开发/设计有一些经验。

我同意你不想被困在四处,因为这需要很多工作和容易出错。我认为Singleton是一个适用的模式。您可以使用仅初始化一次的类来封装维度,并且该类可以为这些值提供单点变化。假设您需要重命名它们,添加其他值或更改类型:您通常仍然可以支持相同的接口并防止波动代码更改。可以使用静态访问器/初始化器在C ++中实现这样的类。值得注意的是,有些人会认为这种模式也是糟糕的代码设计,但如果使用得当,我认为它会满足您的需求。