История изменений
Исправление 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;
Исправление 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;
Исходная версия 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;