LINUX.ORG.RU

История изменений

Исправление X512, (текущая версия) :

и использование goto даёт наиболее простой код из возможных вариантов

Что из этого проще и понятнее?

CObjectDeleter<Object1, void, DeleteObject1> obj1(NewObject1());
if (obj1 == NULL) return ERROR_OBJECT1;

CObjectDeleter<Object2, void, DeleteObject2> obj2(NewObject2());
if (obj2 == NULL) return ERROR_OBJECT2;

CObjectDeleter<Object3, void, DeleteObject3> obj3(NewObject3());
if (obj3 == NULL) return ERROR_OBJECT3;

return Setup(obj1.Detach(), obj2.Detach(), obj3.Detach());
statut_t err;

Object1 *obj1 = NewObject1();
if (obj1 == NULL) {err = ERROR_OBJECT1; goto err1;}

Object2 *obj2 = NewObject2();
if (obj2 == NULL) {err = ERROR_OBJECT2; goto err2;}

Object3 *obj3 = NewObject3();
if (obj3 == NULL) {err = ERROR_OBJECT3; goto err3;}

return Setup(obj1, obj2, obj3);

err3:
DeleteObject2(obj2);

err2:
DeleteObject1(obj1);

err1:
return err;

Исходник CObjectDeleter.

Исправление X512, :

и использование goto даёт наиболее простой код из возможных вариантов

Что из этого проще и понятнее?

CObjectDeleter<Object1, void, DeleteObject1> obj1 = NewObject1();
if (obj1 == NULL) return ERROR_OBJECT1;

CObjectDeleter<Object2, void, DeleteObject2> obj2 = NewObject2();
if (obj2 == NULL) return ERROR_OBJECT2;

CObjectDeleter<Object3, void, DeleteObject3> obj3 = NewObject3();
if (obj3 == NULL) return ERROR_OBJECT3;

return Setup(obj1.Detach(), obj2.Detach(), obj3.Detach());
statut_t err;

Object1 *obj1 = NewObject1();
if (obj1 == NULL) {err = ERROR_OBJECT1; goto err1;}

Object2 *obj2 = NewObject2();
if (obj2 == NULL) {err = ERROR_OBJECT2; goto err2;}

Object3 *obj3 = NewObject3();
if (obj3 == NULL) {err = ERROR_OBJECT3; goto err3;}

return Setup(obj1, obj2, obj3);

err3:
DeleteObject2(obj2);

err2:
DeleteObject1(obj1);

err1:
return err;

Исходник CObjectDeleter.

Исходная версия X512, :

и использование goto даёт наиболее простой код из возможных вариантов

Что из этого проще и понятнее?

CObjectDeleter<Object1, void, DeleteObject1> obj1 = NewObject1();
if (obj1 == NULL) return ERROR_OBJECT1;

CObjectDeleter<Object2, void, DeleteObject2> obj2 = NewObject2();
if (obj2 == NULL) return ERROR_OBJECT2;

CObjectDeleter<Object3, void, DeleteObject3> obj3 = NewObject3();
if (obj3 == NULL) return ERROR_OBJECT3;

return Setup(obj1.Detach(), obj2.Detach(), obj3.Detach());
statut_t err;

Object1 *obj1 = NewObject1();
if (obj1 == NULL) {err = ERROR_OBJECT1; goto err1;}

Object2 *obj2 = NewObject2();
if (obj2 == NULL) {err = ERROR_OBJECT2; goto err2;}

Object1 *obj3 = NewObject3();
if (obj3 == NULL) {err = ERROR_OBJECT3; goto err3;}

return Setup(obj1, obj2, obj3);

err3:
DeleteObject2(obj2);

err2:
DeleteObject1(obj1);

err1:
return err;

Исходник CObjectDeleter.