[Global Scope]
myClass *objA, *objB, *obj;
int objnum;
我想和objA
和objB
之間切換,或者將其分配到obj
,所以在main()
我有奇怪的行爲一個函數被稱爲在兩個對象之間切換:C++ 11類,指針和全球範圍內聲明
void switchObjects()
{
if (++objnum > 1) objnum = 0;
obj = objnum == 0 ? objA : objB;
}
而在我使用該對象的函數中,我有:
void doYourJob()
{
int res = obj->work();
}
現在奇怪的是,如果我不分配obj
要麼objA
或objB
,它仍然有效。相反,我會期待一個例外。即使我做obj = NULL;
,它仍然有效!這是什麼巫術?
OK,我公司可提供帶來同樣的結果不同的例子,不使用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()
兩次。
你不能指望任何未定義的程序*。 – molbdnilo 2015-02-10 13:35:03
在空指針上調用成員函數是未定義的行爲。如果成員函數實際上沒有使用任何類成員,它通常會工作。 – 2015-02-10 13:35:17
我發佈了一個與空指針無關的例子,任何人都可以給我一個線索? – 2015-02-10 14:03:43