【发布时间】:2015-04-10 13:29:40
【问题描述】:
[Global Scope]
myClass *objA, *objB, *obj;
int objnum;
我想在objA 和objB 之间切换并将它们分配给obj,所以在main() 我有:
int main()
{
objA = new myClass(parameters...);
objB = new myClass(parameters...);
// start with objA;
objnum = 0;
obj = objA;
}
有时会调用一个在两个对象之间切换的函数:
void switchObjects()
{
if (++objnum > 1) objnum = 0;
obj = objnum == 0 ? objA : objB;
}
在我使用对象的函数中,我有:
void doYourJob()
{
int res = obj->work();
}
现在奇怪的是,如果我不将 obj 分配给 objA 或 objB,它仍然有效。相反,我希望有一个例外。即使我这样做obj = NULL;,它仍然有效!这是什么巫术?
好的,我可以提供一个不同的示例,它会带来相同的结果,而不使用 NULL 指针:
myClass *obj[2];
int objnum;
void switchObject()
{
if (++objnum > 1) objnum = 0;
}
void doYourJob()
{
res = obj[objnum]->work();
}
int main()
{
obj[0] = new myClass(parameters...);
obj[1] = new myClass(parameters...);
objnum = 0;
}
使用上面的代码,无论 objnum 的值如何,我仍然可以让两个对象一起工作,即使我只在一个实例上调用 work()。
如果我用这个替换函数doYourJob():
void doYourJob()
{
int res1 = obj[0]->work();
int res2 = obj[1]->work();
}
我总是得到翻倍的结果,就好像我对每个对象调用函数 work() 两次一样。
【问题讨论】:
-
你不能期望未定义的程序有任何东西。
-
在空指针上调用成员函数是未定义的行为。如果成员函数实际上不使用任何类成员,它通常会起作用。
-
我发布了一个与空指针无关的不同示例,任何人都可以给我一个线索吗?