我的课程如下:
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;
答案 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();