2013-08-19 6 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

Так я понял, что проблема была. Занятия были прекрасными. Аксессуар, который я использовал для доступа к контейнеру, проходил по значению, а не по ссылке. Таким образом, я бы добавил свои экземпляры в контейнер через мой аксессуар, и они были бы немедленно удалены, когда копия контейнера исчезла из области видимости. Когда мой код, наконец, приблизился к попытке использовать экземпляр моего класса, они уже были разрушены. Doh!