Прокомментируйте правило 52 из книги Саттера и Александреску
От: Ytz https://github.com/mtrempoltsev
Дата: 16.01.09 19:52
Оценка: 3 (1)
Правило 52. Копируйте и ликвидируйте согласованно
Сильно смутил последний абзац. Цитирую:
"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."
Собственно, почему это ошибочно? Я то наоборот считал например такой код очень хорошим:

class Connection
{
public:
  Connection();
private:
  const std::auto_ptr<Port> Port_;
}
...
Connection::Connection()
: Port_(GetPort())
{}
саттер александреску 101 правило 52
Re: Прокомментируйте правило 52 из книги Саттера и Александр
От: MasterZiv СССР  
Дата: 16.01.09 20:05
Оценка:
Ytz пишет:

> Собственно, почему это ошибочно? Я то наоборот считал например такой код


Оператор присваивания не напишешь. Ну т.е. возможно не всегда напишешь.
Ссылку пересослать на что-то другое невозможно.
Хотя, с другой стороны, можно использовать конструктор и placement new ...
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Прокомментируйте правило 52 из книги Саттера и Алекса
От: rg45 СССР  
Дата: 16.01.09 20:35
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Ytz пишет:


>> Собственно, почему это ошибочно? Я то наоборот считал например такой код


MZ>Оператор присваивания не напишешь. Ну т.е. возможно не всегда напишешь.

MZ>Ссылку пересослать на что-то другое невозможно.
MZ>Хотя, с другой стороны, можно использовать конструктор и placement new ...

Так это наоборот можно использовать как полезный прием. Например, при использовании идиомы pImpl. Использование auto_ptr в этом случае вынуждает либо выполнить глубокое копирование в копирующем операторе присваивания, либо явно запретить его.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Прокомментируйте правило 52 из книги Саттера и Александр
От: Alexander G Украина  
Дата: 16.01.09 21:14
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Правило 52. Копируйте и ликвидируйте согласованно

Ytz>Сильно смутил последний абзац. Цитирую:
Ytz>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."
Ytz>Собственно, почему это ошибочно? Я то наоборот считал например такой код очень хорошим:

Ytz>
Ytz>class Connection
Ytz>{
Ytz>public:
Ytz>  Connection();
Ytz>private:
Ytz>  const std::auto_ptr<Port> Port_;
Ytz>}
Ytz>...
Ytz>Connection::Connection()
Ytz>: Port_(GetPort())
Ytz>{}
Ytz>


В другой книге Саттера ("Решение сложных задач на С++") такой код рекомендован
Русский военный корабль идёт ко дну!
Re: Прокомментируйте правило 52 из книги Саттера и Александр
От: rg45 СССР  
Дата: 16.01.09 21:17
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Правило 52. Копируйте и ликвидируйте согласованно

Ytz>Сильно смутил последний абзац. Цитирую:
Ytz>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."

Может, какой-то дефект перевода? Оригинал бы глянуть.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Прокомментируйте правило 52 из книги Саттера и Алекса
От: skeptik_  
Дата: 16.01.09 22:46
Оценка: 3 (1)
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Ytz, Вы писали:


Ytz>>Правило 52. Копируйте и ликвидируйте согласованно

Ytz>>Сильно смутил последний абзац. Цитирую:
Ytz>>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."

R>Может, какой-то дефект перевода? Оригинал бы глянуть.


In a class holding a reference or an auto_ptr, you likely need to write the copy constructor and the assignment operator, but the default destructor already does the right thing. (Note that using a reference or auto_ptr member is almost always wrong.)

Re: Прокомментируйте правило 52 из книги Саттера и Александр
От: Sergey Россия  
Дата: 16.01.09 23:01
Оценка: 6 (1) +1
Здравствуйте, Ytz, Вы писали:

Ytz>Правило 52. Копируйте и ликвидируйте согласованно

Ytz>Сильно смутил последний абзац. Цитирую:
Ytz>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."
Ytz>Собственно, почему это ошибочно? Я то наоборот считал например такой код очень хорошим:

Ytz>
Ytz>class Connection
Ytz>{
Ytz>public:
Ytz>  Connection();
Ytz>private:
Ytz>  const std::auto_ptr<Port> Port_;
Ytz>}
Ytz>...
Ytz>Connection::Connection()
Ytz>: Port_(GetPort())
Ytz>{}
Ytz>


У auto_ptr довольно своеобразная семантика копирования — передача владения. Собственно, он заточен для возврата "жирных" значений из функций. Для пользовательских классов такое поведение требуется крайне редко, потому и написано, что скорее всего ошибка. Обычно подходят boost::scoped_ptr (при этом конструктор копирования и оператор присваивания автоматичски идут нафиг), либо shared_ptr/intrusive_ptr — с ними, понятное дело, будет и дефолтное копирование с подсчетом ссылок.
У auto_ptr есть еще одна особенность, которая делает его полезным — наличие функции release. Что позволяет организовать, например, передачу владения во время многостадийной инициализации, типа такого:
class C
{
  boost::scoped_ptr<A> a;
  boost::scoped_ptr<B> b;
public:
  C(A *a, B *b) : a(a), b(b) {}
};

void foo()
{
  std::auto_ptr<A> a(new A());
  std::auto_ptr<B> b(new B());

  C c(a.release(), b.release());
}
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.