2016-09-07 50 views
1

我正在使用OIS處理Ogre的輸入,並且當前在KeyPress/Release一個消息對象,如下所示將在訂閱者中構建和分發。C++設置具有const成員的成員對象

class Message 
{ 
public: 
    Message(); 
    ~Message(); 

    inline void SetKeyEvent(const OIS::KeyEvent& keyEvent) { _keyEvent = keyEvent; } 

    const OIS::KeyEvent& GetKeyEvent() const { return _keyEvent; } 

private: 

    OIS::KeyEvent _keyEvent; 

}; 

由於該對象將被構造/每當經由鍵盤接收到的輸入破壞,我試圖存儲構造預消息對象,然後簡單地用新的數據來更新_keyEvent字段,分發之前。

問題是,OIS::KeyEvent對象有一個阻止我使用賦值運算符的const成員。 SetKeyEvent方法給我以下語法錯誤:

function "OIS::KeyEvent::operator=(const OIS::KeyEvent &)" (declared implicitly) cannot be referenced -- it is a deleted function 

我想知道什麼是實現這種功能的最佳方式是?

在此先感謝

編輯:只是爲了澄清,在可能的情況我已經使用初始化列表。我的意圖是預先構造消息對象,然後使用SetKeyEvent方法使用來自OIS觸發的KeyPress事件的新事件數據更新_keyEvent字段。我想知道這是否可行,如果是這樣,那麼做到最好的方法是什麼。

+1

這不是一個const成員。這意味着'OIS :: KeyEvent'沒有賦值操作符。 – Hayt

+0

[爲什麼我應該更喜歡使用成員初始化列表?](http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list) – LogicStuff

+2

@Hayt它沒有默認的賦值運算符*,因爲*裏面有一個const成員。 –

回答

1

複製操作符被刪除,所以你必須使用指針。

class Message 
{ 
public: 
    Message(); 
    ~Message(); 

    inline void SetKeyEvent(OIS::KeyEvent* keyEvent) { _keyEvent = keyEvent; } 

    const OIS::KeyEvent& GetKeyEvent() const { return _keyEvent; } 

private: 

    OIS::KeyEvent* _keyEvent; 

}; 

現在最好檢查一下setter中的參數是不是nullptr。

inline void SetKeyEvent(OIS::KeyEvent* keyEvent) 
{ 
    assert(keyEvent != nullptr); 
    _keyEvent = keyEvent; 
} 

assert()需要#include <assert.h>

編輯:

對不起,忘getter方法。你也必須使用指針。

const OIS::KeyEvent* keyEvent = &Message.GetKeyEvent(); 

其中Message是您的類實例。

+0

不要這樣做。使用構造函數[正確](http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list),就是這樣。 –

+0

當調用getter並且沒有構造函數調用時拋出錯誤消息。 – pospich0815

+0

什麼錯誤信息?如果您對吸氣劑有疑問,請提問。 –

0

它是通過使用安置新的明確的析構函數調用可能,你的東西通常不應該做的事:

inline void SetKeyEvent(const OIS::KeyEvent& keyEvent) 
{ 
    _keyEvent.~KeyEvent(); 
    new (&_keyEvent) OIS::KeyEvent(keyEvent); 
} 

這是壞的醜陋可怕的代碼,請使用您自己的風險。