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;
4

1 回答 1

0

所以我弄清楚了问题所在。上课很好。我用来访问容器的访问器是按值传递的,而不是引用传递。所以,我会通过我的访问器将我的实例添加到容器中,当容器的副本超出范围时,它们将立即被丢弃。当我的代码终于开始尝试使用我的类的实例时,它们已经被破坏了。嗬!

于 2013-08-20T17:37:16.203 回答