Хорошо, это очень странно ... Я думаю. Что я имею в виду под названием:
внутри функции 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 .. Надеюсь, это проясняет ситуацию.