У меня есть родительский класс, у которого есть переменная, которую я заполняю из дочерних классов. Но во время выполнения выражение, похоже, никогда не заполняется. Это даже не пусто. Это просто случайная вещь, которую 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