从另一个类访问C ++静态成员

时间:2013-02-03 01:17:19

标签: c++ static member

我的课程如下:

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,我可以看到在参数对象的解析器方法中,正确的值在静态成员中。但是在Controller :: Controller()方法中,我只是垃圾。

我做错了什么?

提前致谢。

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

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

2 个答案:

答案 0 :(得分: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::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;

答案 1 :(得分:1)

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

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

Controller controller;
controller.initialise();