0

好吧,这很奇怪……我想。我对标题的意思是:

在 actionHandler 对象的 act() 函数中,我有:

state->getHumanPieces();

这给了我某种地址违规,显然'this'没有初始化'state'变量......碰巧这个actionHandler类有一个静态变量,它是一个指向自身实例的指针,称为'handler '...如果我这样做:

handler->state->getHumanPieces();

它完美地工作..为了使这一点更加清晰:

那个“处理程序”指针指向整个程序中存在的唯一 actionHandler 实例(单例模式)。所以基本上当我从我的 actionHandler 对象运行这个 act() 函数时,它不允许我访问“状态”变量,但是如果从那个对象,我尝试通过指向同一个对象的指针访问同一个变量,可以吗?我不明白发生了什么..我不确定它是否清楚,可能有点令人困惑,但我希望它是可以理解的..

顺便说一句,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 中有一个类似的结构(单例)和一个 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* 一个.. 希望这能让它更清楚。

4

4 回答 4

1

看起来像这里描述的静态初始化命令惨败的情况。您的两个静态对象构造函数都以循环方式相互依赖,这很奇怪。

于 2009-11-30T10:36:43.817 回答
1

您的this指针为空。

正在发生这样的事情:

actionHandler* actObj = 0;
actObj->act(); // ERROR access violation
于 2009-11-30T04:22:35.930 回答
0

你的 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 中访问 this 指针或状态变量(或从 actionHandler 中进行的任何后续调用),因为没有 this 指针,也没有当前对象。

这就是为什么在使用handler->state->getHumanPieces()它时起作用的原因,因为现在,您实际上指的是 CThing 类(处理程序)的实例,而不是类定义本身。

我希望我足够清楚......如果没有,请不要犹豫,要求精确。

于 2009-11-30T05:23:38.913 回答
0

确保actionHandler您正在调用的对象act()已初始化。在我看来,它就像是act()null指针调用。

于 2009-11-30T04:20:17.750 回答