Comme mentionné, vous avez une récursivité infinie; Toutefois, pour ajouter à cela, voici un moyen infaillible pour mettre en œuvre op =:
struct T {
T(T const& other);
T& operator=(T copy) {
swap(*this, copy);
return *this;
}
friend void swap(T& a, T& b);
};
Ecrivez une copie correcte cteur et d'échange, et la sécurité d'exception et tous les cas de bord sont traités pour vous!
Le paramètre copy est transmis par la valeur, puis modifié. Toutes les ressources que l'instance actuelle doit détruire sont gérées lorsque la copie est détruite. Cela suit current recommendations et gère self-assignment proprement.
#include <algorithm>
#include <iostream>
struct ConcreteExample {
int* p;
std::string s;
ConcreteExample(int n, char const* s) : p(new int(n)), s(s) {}
ConcreteExample(ConcreteExample const& other)
: p(new int(*other.p)), s(other.s) {}
~ConcreteExample() { delete p; }
ConcreteExample& operator=(ConcreteExample copy) {
swap(*this, copy);
return *this;
}
friend void swap(ConcreteExample& a, ConcreteExample& b) {
using std::swap;
//using boost::swap; // if available
swap(a.p, b.p); // uses ADL (when p has a different type), the whole reason
swap(a.s, b.s); // this 'method' is not really a member (so it can be used
// the same way)
}
};
int main() {
ConcreteExample a (3, "a"), b (5, "b");
std::cout << a.s << *a.p << ' ' << b.s << *b.p << '\n';
a = b;
std::cout << a.s << *a.p << ' ' << b.s << *b.p << '\n';
return 0;
}
avis qu'il fonctionne soit avec les membres gérés manuellement (p) ou des membres de style SBRM RAII/(s).
Pas tout à fait compris. La structure est-elle un modèle? Donc par échange, la copie sera l'original * ceci? – Tim
Merci! Est-ce que le swap change aussi de "copie"? Est-ce plus qu'une mission? – Tim