Imaginez que quelqu'un vous demande de dessiner un tableau... le feriez-vous ?
- dessinez d'abord votre par défaut ( 1er ) (ce visage familier que vous aimez tant),
- puis dessinez ce que cette personne a demandé ( 2ème ),
- seulement pour dessiner la même chose une fois de plus, mais sur la toile contenant votre par défaut ,
- et ensuite brûler le 2ème la peinture ?
Ce billet va tenter d'expliquer pourquoi cette comparaison est pertinente.
POURQUOI EST-CE UNE MAUVAISE IDÉE ?
Je n'ai jamais vu un Constructeur par défaut mis en œuvre avec l'utilisation de la opérateur de mission et, honnêtement, ce n'est pas quelque chose que je recommanderais, ni que je soutiendrais lors d'une conférence de presse. révision du code .
Le problème majeur de ce type de code est que, par définition, nous construisons deux (au lieu d'un seul) et en appelant un fonction-membre ce qui signifie que nous construisons tous nos membres deux fois, et que nous devons ensuite copier/déplacer l'initialisation de tous les membres en appelant la fonction opérateur d'affectation .
Il n'est pas intuitif qu'en demandant la construction de 1 nous construisons 2 pour ensuite copier les valeurs de l'objet 2ème au 1er et jetez le 2ème .
Conclusion : Ne le faites pas. .
( Note : Dans un cas où Weapon
a des classes de base, ce sera encore pire ;)
( Note : Un autre danger potentiel est que la fonction d'usine utilise accidentellement le constructeur par défaut, ce qui entraîne une récursion infinie qui n'a pas été attrapée lors de la compilation, comme l'a noté @. Ratchet Freat )
SOLUTION PROPOSÉE
Dans votre cas particulier, il est préférable d'utiliser une argument par défaut dans votre constructeur, comme dans l'exemple ci-dessous.
class Weapon {
public:
Weapon(WeaponType w_type = CHAIN_GUN);
...
}
Weapon w1; // w_type = CHAIN_GUN
Weapon w2 (KNOWLEDGE); // the most powerful weapon
( Note : Une alternative à ce qui précède serait d'utiliser une constructeur délégué (disponible en C++11)