C ++ auto_ptr и конструкция копирования - PullRequest
0 голосов
/ 22 июня 2010

Если у меня есть класс

template <typename T>
struct C {
...

private:
  auto_ptr<T> ptr;
};

Как определить конструктор копирования для C:

Не может быть

template <typename T>
C<T>::C(const C& other) 

потому что я хочу, чтобы, если я скопировал auto_ptr из другого, я изменил другое, удалив владение. Разрешено ли определять конструктор копирования как

template <typename T>
C<T>::C(C& other) {}

Ответы [ 3 ]

1 голос
/ 22 июня 2010

Вы действительно хотите скопировать состояние своего класса или перенести его?Если вы хотите скопировать его, вы делаете это так же, как любой другой класс с указателями в нем:

template < typename T >
C<T>::C(C const& other) : ptr(new T(*other.ptr)) {} // or maybe other.ptr->clone()

Если вы действительно хотите передать владение указателем, вы можете сделать это с неконстантной "копией""конструктор, но я бы порекомендовал вам сделать что-то более очевидное на сайте вызовов;что-то, что говорит людям, читающим код, о том, что право собственности перешло.

1 голос
/ 22 июня 2010

Если вы хотите предотвратить передачу права собственности и / или копирования, вы можете определить конструктор копирования и оператор присваивания private, тем самым запретив пользователям вашего класса копировать или назначать ваш объект.

0 голосов
/ 22 июня 2010

Нет такого понятия, как «стандартный» конструктор копирования, но люди ожидают, что они будут вести себя определенным образом.Если ваш объект собирается передать право собственности на копию, плохая идея - создать конструктор копирования, который затемнит этот факт.Лучшим подходом было бы создать метод, который прояснит это.(Вы можете назвать это CloneAndTransfer или что-то подобное.)

...