我正在使用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
字段。我想知道这是否可能,如果可行,最好的方法是做什么。
答案 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);
}
这是糟糕的丑陋可怕代码,使用风险自负。