- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
void TExternalIOBuffer::swap(TExternalIOBuffer& Buffer)
{
ASSERT(typeid(Buffer)==typeid(TExternalIOBuffer));
const TExternalIOBuffer CurrentBuffer=*this;
const TExternalIOBuffer OtherBuffer=Buffer;
Buffer.~TExternalIOBuffer();
::new((void*)&Buffer) TExternalIOBuffer(CurrentBuffer);
this->~TExternalIOBuffer();
::new((void*)this) TExternalIOBuffer(OtherBuffer);
};
const TExternalIOBuffer& TExternalIOBuffer::operator=(const TAbstractIOBuffer& Buffer)
{
this->~TExternalIOBuffer();
::new((void*)this)TExternalIOBuffer(Buffer);
return *this;
};
someone 16.04.2012 14:10 # 0
Использовать std::swap религия не позволяет? Или определять копирующий конструктор через оператор =, а не наоборот?
Зачем всё это шаманство с placement new? Тем более криво реализованное и неработающее. Особенно умиляет двойной вызов конструктора для временного объекта на стеке.
Говногость 16.04.2012 15:09 # −1
Понятно, что это нужно переписать, но сейчас нет времени этим заниматься.
> Тем более криво реализованное и неработающее. Особенно умиляет двойной вызов конструктора для временного объекта на стеке.
Можно поподробнее по обоим пунктам? У нас ошибка не проявляется, ибо заказчик уже использует прогу.
Ну и может ещё какие проблемы углядели за этим кодом? Огласите весь список пожалуйста. Часть проблем я вижу, ну а может я что-то проглядел.
someone 16.04.2012 16:27 # +1
или, если религия не позволяет использовать стандартную библиотеку...
Оба варианта проще, чем то, что в коде, и наверняка быстрее (один конструктор, один деструктор и два оператора присваивания вместо четырёх конструкторов и четырёх деструкторов).
Мораль: не пишите чрезмерно заумный код. Пишите то, что имеете в виду.
Говногость 16.04.2012 17:25 # 0
someone 16.04.2012 17:59 # 0
Присвоить переменную примитивного типа самой себе можно, и это ноп. Чем объекты хуже? :)
Говногость 16.04.2012 18:26 # 0
Не, явно признак какой-то незапланированной ситуации. Так что лучше ассерт.
Steve_Brown 16.04.2012 19:02 # 0
Говногость 16.04.2012 19:06 # 0
А if (this == &Buffer) { return *this; } нужен на всякий случай для релиза.
Steve_Brown 17.04.2012 09:54 # +1
Говногость 19.04.2012 23:07 # 0