我有一个父类,它有一个从子类填充的变量。但在运行时,表达式似乎永远不会被填充。它甚至不是空的。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;