Re[5]: оператор копирования
От: Константин Ленин  
Дата: 08.09.05 11:31
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Константин Ленин, Вы писали:



КЛ>>добавлю, и что дальше? Часто конструктор копирования и оператор присваивания имеют одну и ту же логику, и один реализуется через другой


ssm>
ssm>One& operator=( const One& one )
ssm>{
ssm>  i = one.i;
ssm>  canThrow1 = one.canThrow1;
ssm>  canThrow2 = one.canThrow2;
ssm>}
ssm>


ssm>С твоим конструктором копирования, реализованным посредством оператора присваивания все будет в порядке, тоесть будет брошено исключение, и объект не будет создан.

ssm>С оператором присваивания все хуже, ведь он вызывается для уже существующего объекта, и если произойдет исключение при вызове оператора= для canThrow1 или canThrow1, то объект класса One останется в некорректном состоянии
ssm>При обратной реализации(c временным объектом) этого не произойдет.

Согласен, но моя реализация не претендует на повсеместное использование.
В большинстве случаев при выбросе исключения мне уже будет все равно, что там с объектом, которого я пытаюсь создать — он новый и никакой( в большинстве случаев) полезной информации не несет и дальнейшее его использование( полсе обработки исключения ) не имеет смысла( опять же в большинстве случаев)
Re[6]: оператор копирования
От: ssm Россия  
Дата: 08.09.05 11:51
Оценка:
Здравствуйте, Константин Ленин, Вы писали:


КЛ>Согласен, но моя реализация не претендует на повсеместное использование.

КЛ>В большинстве случаев при выбросе исключения мне уже будет все равно, что там с объектом, которого я пытаюсь создать — он новый и никакой( в большинстве случаев) полезной информации не несет и дальнейшее его использование( полсе обработки исключения ) не имеет смысла( опять же в большинстве случаев)

Константин, ты путаешь вызов конструктора копирования для еще несуществующего объекта и оператора присваивания для уже созданного объекта.


Dummy obj;
//...
try
{
  //...
  obj = otherObj;
  //...
}
catch(const std::exception &)
{  
 //...
}

//*!!!*
obj.foo();


в точке *!!!* имеем дело с баго-объектом
Re[7]: оператор копирования
От: Константин Ленин  
Дата: 08.09.05 12:32
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Константин Ленин, Вы писали:



КЛ>>Согласен, но моя реализация не претендует на повсеместное использование.

КЛ>>В большинстве случаев при выбросе исключения мне уже будет все равно, что там с объектом, которого я пытаюсь создать — он новый и никакой( в большинстве случаев) полезной информации не несет и дальнейшее его использование( полсе обработки исключения ) не имеет смысла( опять же в большинстве случаев)

ssm>Константин, ты путаешь вызов конструктора копирования для еще несуществующего объекта и оператора присваивания для уже созданного объекта.



ssm>
ssm>Dummy obj;
ssm>//...
ssm>try
ssm>{
ssm>  //...
ssm>  obj = otherObj;
ssm>  //...
ssm>}
ssm>catch(const std::exception &)
ssm>{  
ssm> //...
ssm>}

ssm>//*!!!*
ssm>obj.foo();

ssm>


ssm>в точке *!!!* имеем дело с баго-объектом


Да, ему кирдык, но
1)в !!! он мне уже не нужен, смотри пункт 2
2)Код не в тему, я говорю про реализацию копирования через присвоение

т.е.



SomeClass *c;
SomeClass c1(....);

try
{
   c = new SomeClass(c1);
}
catch(){}

//бессмысленный код)
c->SomeMethod() //Если при вызове конструктора копирования выбрасывется эксепшн, мне этот объект уже не нужен
Re[8]: оператор копирования
От: ssm Россия  
Дата: 08.09.05 12:36
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>2)Код не в тему, я говорю про реализацию копирования через присвоение


А я говорю о том что оператор= при твоей реализации приводит к ошибкам при его использовании
Re[9]: оператор копирования
От: Константин Ленин  
Дата: 08.09.05 12:48
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Константин Ленин, Вы писали:


КЛ>>2)Код не в тему, я говорю про реализацию копирования через присвоение


ssm>А я говорю о том что оператор= при твоей реализации приводит к ошибкам при его использовании



МОЙ оператор не может привести к ошибкам, приветсти к ошибкам могут операторы=, который монут выкинуть исключение. Я просто написал пример, как можно сделать в НЕКОТОРЫХ случаях
Re[10]: оператор копирования
От: ssm Россия  
Дата: 08.09.05 12:52
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>приветсти к ошибкам могут операторы=, который монут выкинуть исключение.

только те которые оставят объект в испорченном состоянии
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.