0
我有一个父类,有一个变量,我从子类填充。但是在运行时,表达式似乎永远不会被填充。它甚至不是空的。这只是一些随机的东西,IDE只是说“不能评估表达式”。我已经完成了初始化代码,它似乎总是正确初始化。但是当我稍后在运行时调用这个变量时,它只是抛出它手中的空气,并表示它不知道这是什么。为什么我的基类变量在运行时未定义?我正在初始化它从子类
的基类:
namespace Events
{
class MessageReceiver;
class MessageJoint
{
public:
MessageJoint(Ogre::String id, MessageReceiver* receiver);
void FireEvent(MessageReceiver* from);
void SetData(boost::any d){ data = d; }
void SetIdentifier(Ogre::String id){ identifier = id; }
virtual void HandleEvent(boost::any) = 0;
void TuneIn(MessageReceiver* r)
{
listeners.push_back(r);
}
Ogre::String GetIdentifier(){ return identifier; }
MessageReceiver* owner;
std::vector< MessageReceiver* > listeners;
boost::any data;
private:
Ogre::String identifier;
};
}
消耗基类的一个子类:
class JointCloseMenu : public Events::MessageJoint
{
public:
static const Ogre::String cJointCloseMenuId;
JointCloseMenu(Events::MessageReceiver* receiver) : Events::MessageJoint(cJointCloseMenuId, receiver){}
void HandleEvent(boost::any);
#define JOINTCLOSEMENUNAME Ogre::String("JointCloseMenu")
};
这里是我如何对其进行初始化。你可以看到我设置了两次标识符的值!
Events::MessageJoint::MessageJoint(Ogre::String id, MessageReceiver* receiver)
: identifier(id), owner(receiver), data(0)
{ SetIdentifier(id); }
这里是它爆炸的功能。它进入MessageJoint :: GetIdentifier,并在那里发现标识符不是有效的内存地址。在IDE只是说表达不能评价:
void Events::MessageJoint::FireEvent(MessageReceiver* from)
{
Ogre::String blah = GetIdentifier(); //<--KABOOM!!!!
Message m(from->GetMyAddress(), owner->GetMyAddress(), GetIdentifier(), &data);
EventManager::getInstance()->MessageDispatch(m);
//}
}
我忘了介绍我是如何初始化cJointCloseMenuId。在为JointCloseMenu类的实现文件,我初始化字符串的名称,像这样:
const Ogre::String cJointCloseMenuId;
你在哪里初始化'cJointCloseMenuId'?也许这是一个全局初始化顺序问题。 – celtschk
如果您准备[最小完整示例](http://sscce.org),您可能在发布之前自己找到答案。 – Beta
也许你正在一个被破坏的对象上调用'FireEvent'。从所提供的信息很难说。 – jxh