2017-09-07 37 views
4

我還沒有找到一種方法來在構造函數內成功地初始化類成員,我找不到原因。C++類的靜態結構成員定義

我有一個頭文件:

#pragma once 

struct STATE_MOUSE { 
    bool moving; 
    int left_button; 
    int right_button; 
    int middle_button; 
    bool scroll_up; 
    bool scroll_down; 
}; 

class Message { 
private: 
    static STATE_MOUSE state_mouse; 
public: 
    Message(); 
    ~Message(); 
}; 

然後,我有一個源文件:

#include "message.hpp" 

STATE_MOUSE Message::state_mouse = {false, 0, 0, 0, false, false}; 

Message::Message() { 
    //Would like to initialize state_mouse here somehow. 
} 

Message::~Message() { 

} 

我們的問題。這個設置似乎工作。然而,我用來初始化構造函數中的成員,並且我還沒有找到用這個靜態結構成員來實現這一點的方法。

下面的方法不起作用,可能有人解釋一下爲什麼?

state_mouse.moving = false; 
+1

'static'構件系在'class'作爲一個整體,而不是個別'instances'其中'constructor'構建體。 – CinCout

+2

只有一個'Message :: state_mouse'的實例。它存在於任何'Message'實例創建之前。在'Message'構造函數中初始化它已經太遲了。 –

+0

阿當。當然你的答案很有道理。謝謝! –

回答

3

在聲明成員作爲static將屬於class只有一個實例,而不是到class的對象,因此,你不能在構造函數中初始化。構造函數是一個特殊的成員函數,主要用於初始化新對象的非static成員。

請注意,成員由class的所有對象共享,並且當對象更改它時,可以從同一class的所有其他對象中看到更改。如果這是你想達到的目標,那麼你展示的方法是很好的。

+0

我感謝你的回答。這很愚蠢,因爲這正是我所要做的(靜態被分享到所有實例),但我的大腦在早上無法弄清楚我做錯了什麼:) –

+0

@ Mikko-PenttiEinariEronen,不客氣。 :) – Akira

0

靜態成員變量不與類的每個對象相關聯。它由所有對象共享。

如果聲明的類中的靜態變量,那麼你應該在CPP文件中定義它,否則,你可以得到錯誤undefined reference

注意,如果靜態成員變量是const int的類型(例如intboolchar)的,則可以然後聲明和初始化直接在頭文件中的類聲明中的成員變量。