[Global Scope]
myClass *objA, *objB, *obj;
int objnum;
Я хочу, чтобы переключаться между objA
и objB
и назначать их в качестве альтернативы obj
, поэтому в main()
у меня есть:C++ 11 странное поведение с классами, указателей и глобальных деклараций области видимости
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()
дважды на каждом объекте.
Вы не можете ожидать * ничего * от неопределенной программы. – molbdnilo
Вызов функции-члена по нулевому указателю - это неопределенное поведение. Он часто работает, если функция-член фактически не использует членов класса. –
Я отправил другой пример, который не имеет никакого отношения к указателям на нуль, кто-нибудь может дать мне ключ? –