2016-09-07 47 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); 
} 

这是坏的丑陋可怕的代码,请使用您自己的风险。