2013-02-03 52 views
0

我有一类这样的:现在访问C++从另一个类的静态成员

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; 
} 

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

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

一切都编译好。拿出GDB,我可以看到在参数对象的解析器方法中,正确的值在静态成员内部。但在Controller :: Controller()方法中,我只是得到垃圾。

我在做什么错?

在此先感谢。

编辑: 在参数类的cpp文件,我做以下(任何方法之外):

int Parameter::WindowWidth; 
int Parameter::WindowHeight; 
+1

你初始化静态成员?用什么值? – 0x499602D2

+0

如何确保'Parameter :: WindowWidth'在Controller之前初始化? – billz

+0

@大卫:我没有初始化他们的价值。我在帖子上做了编辑。 –

回答

1

的问题仅仅是初始化的顺序。通过解析ini文件

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 
} 

然后你初始化参数:在这里,你构建控制器:

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

发生这种情况时,对于控制器的构造函数被调用,执行以下操作。但控制器得到这些值之前你做到了。 除非Controller正在存储对静态成员的引用,否则它只会保留这些垃圾值。

一个简单的解决方法是将代码从您的构造函数移动到Controller的'initialise'方法中。例如,

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

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

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

Controller controller; 
controller.initialise();