1

我有一个像下面这样的类:

class Parameter {
public:
    Parameter();
    virtual ~Parameter();

    bool parse();

    static int WindowWidth;
    static int WindowHeight;
    ....
};

现在,我主要选择:

int main(int argc, char *argv[]) {
    Parameter parameter;
    Controller controller;

    parameter.parse("parameter.ini");
    controller.initialise();

    return 0;
}

现在,在 Controller 对象中,我需要访问 Parameter 类的静态成员。因此,我只是在做:

Controller::Controller() {
    m_numberOfSweepers = Parameter::NumberOfSweepers;
    m_ticks = Parameter::NumberOfTicks;
    m_window_cx = Parameter::WindowWidth;
    m_window_cy = Parameter::WindowHeight;
}

一切都编译得很好。取出GDB,可以看到在parameter对象的parser方法中,正确的值在静态成员中。但是在 Controller::Controller() 方法中,我得到了垃圾。

我究竟做错了什么?

提前致谢。

编辑: 在 Parameter 类的 cpp 文件中,我执行以下操作(在任何方法之外):

int Parameter::WindowWidth;
int Parameter::WindowHeight;
4

2 回答 2

1

问题只是初始化的顺序。在这里,您构建控制器:

int main(int argc, char *argv[]) {
  Parameter parameter;
  Controller controller;

发生这种情况时,将调用控制器的构造函数,执行以下操作:

Controller::Controller() {
  m_numberOfSweepers = Parameter::NumberOfSweepers; // uninitialized garbage
  m_ticks = Parameter::NumberOfTicks; // uninitialized garbage
  m_window_cx = Parameter::WindowWidth; // uninitialized garbage
  m_window_cy = Parameter::WindowHeight; // uninitialized garbage
}

然后通过解析ini文件来初始化参数。但是控制器在你这样做之前得到了这些值。除非 Controller 存储对静态成员的引用,否则它只会保留那些垃圾值。

一个简单的解决方法是将代码从构造函数移动到控制器的“初始化”方法中。例如,

Controller::Controller() : m_numberOfSweepers(0)
                         , m_ticks(0)
                         , m_window_cx(0)
                         , m_window_cy(0)
{
  // now empty
}

void Controller::initialise()
{
  m_numberOfSweepers = Parameter::NumberOfSweepers;
  m_ticks = Parameter::NumberOfTicks;
  m_window_cx = Parameter::WindowWidth;
  m_window_cy = Paramter::WindowHeight;
}

假设您以正确的顺序调用它,这将解决当前的问题。但我认为这个设计可能有点乱。为什么这些参数需要一个单独的类?

如果你想坚持下去,也许试着给它一个不那么笼统的名字,比如 ControllerParameters 什么的?无论如何,祝你好运。祝你今天过得愉快!

编辑 它也可以很好地为您初始化这些静态变量,这样它们就不会完全是垃圾。垃圾是坏的。只需说以下内容:

int Parameter::WindowWidth = 0;
int Parameter::WindowHeight = 0;
于 2013-02-03T01:39:12.877 回答
1

您的初始化顺序错误。一种可能的方法是,主要做:

Parameter parameter;
parameter.parse("parameter.ini");

Controller controller;
controller.initialise();
于 2013-02-03T01:47:53.230 回答