2013-02-03 33 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();