好的,这很奇怪......我想。我对标题的意思是:
来自我有的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相同。希望这会让它更清晰。
答案 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类(处理程序)的一个实例,而不是类定义本身。
我希望我足够清楚......如果没有,请不要犹豫要求精确。