c ++:无法计算对象的变量,但是从引用到同一对象的变量可以吗?

时间:2009-11-30 04:16:14

标签: c++ this instance

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

来自我有的actionHandler对象的act()函数:

state->getHumanPieces();

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

handler->state->getHumanPieces();

完美无缺.. 为了使这更清楚:

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

顺便说一下,VS08调试器显示了我的意思:

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

我希望它更清楚,它是显示在小窗口上的小树结构,其中显示了变量的当前值(Autos)。

编辑: 我这样得到这个指针是null,我只是不明白它是如何为null ..我会发布一些代码:

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 * private var,它在以下位置初始化:

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 个答案:

答案 0 :(得分:1)

您的this指针为空。

这样的事情正在发生:

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

答案 1 :(得分:1)

看起来像静态初始化命令fiasco描述here的情况。你的两个静态对象构造函数以循环方式相互依赖,这非常奇怪。

答案 2 :(得分:0)

确保初始化您正在呼叫的actionHandler对象act()。在我看来act()正在调用null指针。

答案 3 :(得分:0)

你的actionHandler()或act()方法是静态的吗?

因为如果是这样,你的this指针是NULL是完全正常的,因为不会从对象的特定实例调用静态方法。

例如,取一个如下所示的对象:

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

如果将CThing :: actionHandler()上的函数指针传递给第三方类以获得某些通知,则此类调用CThing :: actionHandler()方法通知您(通过调用:{{1}如果actionHandler方法不是静态的,那么你将无法从actionHandler(或者在actionHandler中进行的任何后续调用)中访问this指针和状态变量,因为它存在而不是CThing::actionHandler();没有这个指针,没有当前对象。

这就是为什么当它使用ptrThing->actionHandler()时,因为现在,你实际上指的是CThing类(处理程序)的一个实例,而不是类定义本身。

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