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

C++ Setting member object which has const member

我正在使用 OIS 来处理我对 Ogre 的输入,目前,在 KeyPress/Release 上,将构建一个如下所示的消息对象并将其分发给订阅者。

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;

};

因为只要通过键盘接收到输入,这个对象就会是 constructed/destroyed,我试图存储一个预构建的 Message 对象,然后简单地用新数据更新 _keyEvent 字段,之前分发。

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

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

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

提前致谢

编辑:澄清一下,我已经在可能的情况下使用了初始化列表。我的意图是预先构造 Message 对象,然后使用 SetKeyEvent 方法使用 OIS 触发的 KeyPress 事件的新事件数据更新 _keyEvent 字段。我想知道这是否可行,如果可行,最好的方法是什么。

复制操作符被删除,所以你必须使用指针。

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 是您的 class 实例。

可以通过使用 placement new 和显式析构函数调用来实现,这是您通常不应该做的事情:

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

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