C ++ : 객체의 변수를 평가할 수는 없지만 참조에서 동일한 객체에 이르기까지 변수?

StackOverflow https://stackoverflow.com/questions/1817814

  •  10-07-2019
  •  | 
  •  

문제

좋아, 이건 이상하다 ... 나는 생각한다. 제목의 의미는 다음과 같습니다.

ACT () 내부에서 ACTION HANDLER 객체에서 다음 :

state->getHumanPieces();

나에게 어떤 종류의 주소 위반을 제공합니다. 분명히 'this'는 'state'변수가 초기화되지 않은 것 같습니다. 그래서이 액션 핸들러 클래스는 정적 변수를 가지고 있습니다. '... 그리고 내가한다면 :

handler->state->getHumanPieces();

완벽하게 작동합니다 .. 더 명확하게하기 위해 :

이 'Handler'포인터는 전체 프로그램 (Singleton Pattern)에 존재하는 액션 핸들러의 유일한 인스턴스를 가리 킵니다. 기본적 으로이 ACT () 기능을 실행할 때 액션 핸들러 객체에서 'State'에 액세스 할 수 없습니다. 변수이지만 해당 객체에서 동일한 객체에 대한 포인터를 통해 동일한 변수에 액세스하려고합니다. 괜찮습니까? 무슨 일이 일어나고 있는지 알지 못합니다. 분명한 지 잘 모르겠습니다. 약간 혼란 스럽지만 이해할 수 있기를 바랍니다.

BTW, VS08 디버거는 내 의미를 보여줍니다.

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

나는 그것이 더 명확 해지기를 바랍니다. 그것은 변수의 현재 값이 표시되는 작은 창에 나타나는 작은 나무 구조입니다 (자동).

편집 :이 포인터가 무일하게 알 수 있습니다. 단지 그것이 어떻게 널이 될 수 있는지 이해하지 못합니다. 코드를 게시하겠습니다.

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.hi에서 비슷한 구조 (Singleton)와 ActionHandler* Private VAR이 있습니다.

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

또한 핸들러를 반환하는 gethandler () func. 이 모든 것은 main.cpp에서 초기화되어야합니다.

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

그런 다음 사용됩니다.

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

main.cpp는 헤더가없는 간단한 .c 스타일로 작성되었으므로 예, 핸들러를 호출하는 함수가 정적이라고 생각합니다 ... 그러나 나는 또한 Gamestate* 포인터를 호출합니다. 액션 핸들러* 하나 .. 이것이 더 명확하게 만들기를 바랍니다.

도움이 되었습니까?

해결책

설명 된 정적 초기화 순서의 경우처럼 보입니다. 여기. 두 정적 객체 생성자는 매우 이상한 방식으로 원형 방식으로 서로에 따라 다릅니다.

다른 팁

당신의 this 포인터는 널입니다.

이런 일이 일어나고 있습니다.

actionHandler* actObj = 0;
actObj->act(); // ERROR access violation

확인하십시오 actionHandler 당신이 부르는 대상 act() 켜기는 초기화됩니다. 그것은 내가 좋아해 보인다 act() a null 바늘.

ActionHandler () 또는 act () 메소드가 정적입니까?

그렇다면 정적 메소드가 객체의 특정 인스턴스에서 호출되지 않기 때문에이 포인터가 널이없는 것은 완벽하게 정상입니다.

예를 들어, 다음과 같은 것처럼 보이는 객체를 사용하십시오.

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

Cthing :: ActionHandler ()의 함수 포인터가 제 3 자 클래스로 전달되어 무언가에 알림을받는 경우,이 클래스가 cthing :: actionHandler () 메소드를 호출하여 전화를 걸어 다음에 통지합니다 (전화로 :CThing::actionHandler(); 그리고 아닙니다 ptrThing->actionHandler() ActionHandler 메소드가 정적이지 않은 경우), ActionHandler 내 에서이 포인터 나 상태 변수에 액세스 할 수 없을 것입니다 (또는 ActionHandler 내에서 이루어진 후속 호출)이 포인터가 없기 때문에 전류가 없습니다. 물체.

그렇기 때문에 사용할 때 handler->state->getHumanPieces() 이제는 클래스 정의 자체가 아니라 실제로 Cthing 클래스 (핸들러)의 인스턴스를 언급하고 있기 때문에 작동합니다.

나는 충분히 분명했으면 좋겠다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top