2013-08-19 27 views
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; 
+0

你在哪里初始化'cJointCloseMenuId'?也许这是一个全局初始化顺序问题。 – celtschk

+2

如果您准备[最小完整示例](http://sscce.org),您可能在发布之前自己找到答案。 – Beta

+0

也许你正在一个被破坏的对象上调用'FireEvent'。从所提供的信息很难说。 – jxh

回答

0

所以我想通了什么问题了。课堂很好。我用来访问容器的访问器传递的是价值而不是参考。所以,我会通过我的访问器将我的实例添加到容器中,并且当容器的副本超出范围时,它们将立即被丢弃。当我的代码终于尝试使用我的课程实例时,它们已经被破坏了。卫生署!

相关问题