c ++: переменная объекта не может быть оценена, но переменная из ссылки на тот же объект может? - PullRequest
0 голосов
/ 30 ноября 2009

Хорошо, это очень странно ... Я думаю. Что я имею в виду под названием:

внутри функции act () из объекта actionHandler, который у меня есть:

state->getHumanPieces();

Что дает мне какое-то нарушение адреса, по-видимому, у 'this' нет инициализированной переменной 'state' ... Так получается, что класс actionHandler имеет статическую переменную, которая является указателем на свой экземпляр, называется «обработчик» ... и если я делаю:

handler->state->getHumanPieces();

Работает отлично .. Чтобы сделать это еще яснее:

Указатель «обработчик» указывает на единственный экземпляр actionHandler, существующий во всей программе (шаблон синглтона). Таким образом, в основном, когда я запускаю эту функцию act () из моего объекта actionHandler, она не позволяет мне получить доступ к переменной 'state', НО, если из этого объекта я пытаюсь получить доступ к той же переменной через указатель на тот же объект, он в порядке ?? Я не понимаю, что происходит .. Я не уверен, что это понятно, но немного сбивает с толку, но надеюсь, что это понятно ..

Кстати, отладчик VS08 показывает, что я имею в виду:

this: 0x000000 {state=???}
   handler: someAddress {state= someAddress}
      handler:...
      state:...
state:  CXX0030: ERROR:  expression cannot be evaluated

Я надеюсь, что это проясняет ситуацию, это маленькая древовидная структура, которая отображается в маленьком окне, где отображаются текущие значения переменных (Autos).

EDIT: Я так понимаю, что этот указатель нулевой, я просто не понимаю, как он может быть нулевым .. Я выложу код:

actionHandler.h:

class gameState;

class actionHandler
{ 
public:
        static actionHandler* Instance(){return handler;}
    void act(int,int);
private:
    actionHandler();
    static actionHandler* handler;
    gameState *state;
};

actionHandler.cpp:

actionHandler* actionHandler::handler = new actionHandler();

actionHandler::actionHandler()
{
        state = gameState::Instance();
}
void actionHandler::act(int x, int y)
{
    state->getHumanPieces();
}

теперь в gameState.h у меня есть похожая структура (синглтон) и закрытая переменная actionHandler *, которая инициализируется в:

gameState::gameState()
{
    handler = actionHandler::Instance();
}

, а также функция getHandler (), которая возвращает обработчик. Это все должно быть инициализировано в main.cpp:

gameState *currState = gameState::Instance();
actionHandler *handler = currState->getHandler();

и затем используется:

handler->act(event->button.x,event->button.y);

main.cpp написан в простом стиле .c без заголовка, так что да, я предполагаю, что функция, вызывающая обработчик, является статической ... однако я также делаю вызовы указателя gameState *, который предположительно работает именно в так же, как actionHandler * one .. Надеюсь, это проясняет ситуацию.

Ответы [ 4 ]

1 голос
/ 30 ноября 2009

Похоже, случай фиаско статического порядка инициализации описан здесь . Ваши конструкторы обоих статических объектов зависят друг от друга по кругу, что очень странно.

1 голос
/ 30 ноября 2009

Ваш this указатель нулевой.

Нечто подобное происходит:

actionHandler* actObj = 0;
actObj->act(); // ERROR access violation
0 голосов
/ 30 ноября 2009

Ваши методы actionHandler () или act () статичны?

Потому что если это так, то вполне нормально, что ваш указатель this равен NULL, потому что статические методы не вызываются из конкретного экземпляра объекта.

Например, возьмите объект, который выглядит следующим образом:

class CThing
{
public:
    static void actionHandler();
    void act();
protected:
    static CThing* handler;
    CState state;
}

Если указатель функции на CThing :: actionHandler () передается стороннему классу для получения уведомления о чем-либо, то когда этот класс вызывает метод CThing :: actionHandler () для уведомления вас (путем вызова: CThing::actionHandler(); и не ptrThing->actionHandler(), как если бы метод actionHandler не был статическим), вы не сможете получить доступ к этому указателю или к переменной состояния изнутри actionHandler (или любых последующих вызовов, сделанных из actionHandler), поскольку указатель отсутствует нет текущего объекта.

Именно поэтому при использовании handler->state->getHumanPieces() это работает, потому что теперь вы фактически ссылаетесь на экземпляр класса CThing (обработчик), а не на само определение класса.

Надеюсь, я был достаточно ясен ... Если нет, не стесняйтесь спрашивать о точности.

0 голосов
/ 30 ноября 2009

Убедитесь, что объект actionHandler, который вы вызываете act(), инициализирован. Мне кажется, что act() вызывается по указателю null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...