C ++设置具有const成员的成员对象

时间:2016-09-07 08:28:04

标签: c++ const ogre

我正在使用OIS处理我对Ogre的输入,目前,在KeyPress / Release上,将构建一个Message对象,并在订阅者之间分发。

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;

};

由于只要通过键盘接收输入就会构造/销毁这个对象,我试图存储一个预先构造的Message对象,然后在分发之前简单地用新数据更新_keyEvent字段。

问题是OIS::KeyEvent对象有一个const成员阻止我使用赋值运算符。 SetKeyEvent方法给出了以下语法错误:

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

我想知道实现此功能的最佳方法是什么?

提前致谢

编辑:只是为了澄清,我已尽可能使用初始化列表。我的目的是预构建Message对象,然后使用_keyEvent方法使用OIS触发的KeyPress事件中的新事件数据更新SetKeyEvent字段。我想知道这是否可能,如果可行,最好的方法是做什么。

2 个答案:

答案 0 :(得分: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是您的班级实例。

答案 1 :(得分:-1)

通过使用placement new和一个显式的析构函数调用,你通常不应该这样做:

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

这是糟糕的丑陋可怕代码,使用风险自负。