2010-06-21 5 views
0

Si j'ai une classeC++ auto_ptr et copier la construction

template <typename T> 
struct C { 
... 

private: 
    auto_ptr<T> ptr; 
}; 

Comment définir le constructeur de copie C:

Il ne peut pas être

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

parce que je veux si je copier le auto_ptr de l'autre, j'ai changé d'autre en supprimant la propriété. Est-il légal de définir un constructeur de copie comme

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

Répondre

1

Si vous voulez éviter le transfert de propriété et/ou la copie, vous pouvez définir l'opérateur constructeur de copie et l'affectation private, interdisant ainsi aux utilisateurs de votre classe de jamais copier ou assigner votre objet.

1

Voulez-vous réellement copier l'état de votre classe ou le transférer? Si vous voulez copier alors vous le faites comme tout autre classe avec des pointeurs en elle:

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

Si vous voulez vraiment transférer la propriété du pointeur, vous pouvez le faire avec un constructeur non-const « copie » mais je vous recommande de faire quelque chose de plus évident sur le site d'appel; quelque chose qui indique aux gens qui lisent le code que la propriété a transféré.

+0

S'il veut transférer, il n'a pas besoin de faire quoi que ce soit. Le compilateur fournit le constructeur correct de copie automatiquement dans ce cas - bien que je recommanderais contre cela aussi. –

+0

Intéressant. J'étais sûr que vous aviez tort mais il semble que le compilateur créera alors automatiquement un constructeur non-const pour C. Je vais devoir examiner les règles qui permettent cela. Quoi qu'il en soit, je continue de suivre mon conseil d'utiliser quelque chose de plus évident. –

0

Il n'existe pas de constructeur de copie "standard", mais les utilisateurs s'attendent à ce qu'ils se comportent d'une certaine manière. Si votre objet va faire un transfert de propriété sur la copie, alors c'est une mauvaise idée de faire un constructeur de copie qui obscurcit ce fait. Une meilleure approche serait de créer une méthode qui le rend clair. (Vous pouvez l'appeler CloneAndTransfer ou quelque chose de similaire.)

Questions connexes