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);
}
这是糟糕丑陋的可怕代码,使用风险自负。
我正在使用 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);
}
这是糟糕丑陋的可怕代码,使用风险自负。