Je suis un peu énervé que la règle de la Rule of Five
n'a pas été cité.
Cette règle est très simple :
La règle des cinq :
Lorsque vous écrivez l'un des éléments suivants : Destructor, Copy Constructor, Copy Assignment Operator, Move Constructor ou Move Assignment Operator, vous devez probablement écrire les quatre autres.
Mais il existe une directive plus générale que vous devez suivre, qui découle de la nécessité d'écrire du code sécurisé par les exceptions :
Chaque ressource doit être gérée par un objet dédié
Ici @sharptooth
Le code de l'utilisateur est toujours (en grande partie) correct, mais s'il devait ajouter un deuxième attribut à sa classe, il ne le serait pas. Considérons la classe suivante :
class Erroneous
{
public:
Erroneous();
// ... others
private:
Foo* mFoo;
Bar* mBar;
};
Erroneous::Erroneous(): mFoo(new Foo()), mBar(new Bar()) {}
Que se passe-t-il si new Bar
Jets ? Comment supprimer l'objet pointé par mFoo
? Il existe des solutions (try/catch au niveau des fonctions ...), mais elles ne sont pas adaptées.
La bonne façon de gérer cette situation est d'utiliser des classes appropriées au lieu de pointeurs bruts.
class Righteous
{
public:
private:
std::unique_ptr<Foo> mFoo;
std::unique_ptr<Bar> mBar;
};
Avec la même mise en œuvre de constructeur (ou en fait, en utilisant make_unique
), j'ai maintenant une sécurité exceptionnelle gratuite ! !! N'est-ce pas excitant ? Et le meilleur de tout, je n'ai plus besoin de me soucier d'un destructeur approprié ! J'ai besoin d'écrire mon propre Copy Constructor
y Assignment Operator
cependant, parce que unique_ptr
ne définit pas ces opérations... mais cela n'a pas d'importance ici ;)
Et donc, sharptooth
La classe de l'enfant revisitée :
class Class
{
public:
Class(char const* str): mData(str) {}
private:
std::string mData;
};
Je ne sais pas pour vous, mais je trouve le mien plus facile ;)
0 votes
stackoverflow.com/questions/12577907/default-copy-constructor
1 votes
L'un des cas pour écrire votre propre copie-acteur : Quand vous devez faire une copie profonde. Notez également que dès que vous créez un ctor, aucun ctor par défaut n'est créé pour vous (sauf si vous utilisez le mot-clé default).