2010-11-23 7 views
3

Pour autant que je sache, le constructeur de copie par défaut C++ se comporte uniquement comme prévu lorsque la classe est une classe POD.Désactivation du constructeur par défaut pour les classes non-POD

Je voudrais savoir s'il existe une solution pour empêcher le programmeur d'écrire du code qui utilise (implicitement ou non) le constructeur de copie par défaut si l'objet n'est pas POD.

Je sais que vous pouvez toujours rendre votre copie et votre affectation privées pour résoudre ce problème, mais j'aimerais savoir s'il existe une solution automatisée. Par exemple le compilateur pourrait générer un avertissement dans le cas où votre code génère un appel de constructeur de copie par défaut et votre classe n'est pas POD?

Le but ici est de détecter les cas où j'ai oublié de déclarer la copie/affectation privée ou de les définir manuellement.

Aussi, vous savez si cppcheck peut faire ça?

+4

"Le constructeur de copie par défaut C++ se comporte uniquement comme prévu lorsque la classe est une classe POD." -- C'est faux. Tant que tous ses membres copient correctement, le constructeur de copie par défaut devrait fonctionner correctement. Par exemple, si ma classe a un vecteur , cela copiera bien avec le constructeur de copie par défaut, car il appellera le constructeur de copie de vecteur, qui à son tour appellera le constructeur de copie de chacune de ses chaînes. –

+0

Bon point. Ensuite, il n'y a probablement pas de solution simple à ce problème.Le compilateur devrait passer par tous les graphes d'héritage/composition pour voir si tous les membres ont des constructeurs de copie définis, soit POD, je devine:/ – Dinaiz

Répondre

2

La méthode centralisée pour désactiver la construction par défaut consiste à rendre le constructeur par défaut inaccessible. Vous écrivez: "Je voudrais savoir s'il existe une solution pour empêcher le programmeur d'écrire du code qui utilise (implicitement ou non) le constructeur de copie par défaut si l'objet n'est pas POD."

Vraisemblablement, vous voulez dire que vous souhaitez que le compilateur réagisse à toute construction par défaut d'un objet non-POD.

Désolé, pas de manière indépendante du compilateur. Raison: un grand nombre de classes non-POD, telles que les pointeurs intelligents et les conteneurs tels que std::vector, s'appuient sur la construction par défaut pour être utiles.

Le compilateur g ++ a une option -Weffc++ pour mettre en garde contre les violations des lignes directrices Scott Meyers ’ efficace C++, mais pour autant que je sache – je peux me tromper – cela ne comprend pas votre cas. Peut être utile, cependant.

Vive & HTH,

+0

"Désolé, pas de manière indépendante du compilateur": existe-t-il un chemin dépendant du compilateur? ? J'utilise Visual studio 2008. – Dinaiz

+0

En fait, après quelques recherches, -WeffC++ fait plus ou moins ce que je veux (parti mais c'était mon principal cas d'utilisation) De g ++ man page: Avertir sur les violations des directives de style suivantes de Scott Meyers 'Livre C++ effectif: Rubrique 11: Définir un constructeur de copie et un opérateur d'affectation pour les classes avec de la mémoire allouée dynamiquement. – Dinaiz

2

Non, car c'est une exigence de la langue.

2

Lors de la création d'une classe, vous avez 3 possibilités: avoir la copie par défaut ctor, écrire la vôtre ou la désactiver (avec différentes manières de le faire, hériter de boost::noncopyable pour en mentionner une). Pas si clair pourquoi le compilateur devrait vous avertir au sujet de choisir un de ces derniers.

3

En C++ 0x vous pouvez empêcher explicitement l'utilisation des fonctions membres spéciales comme ceci:.

struct NonCopyable { 
    NonCopyable & operator=(const NonCopyable&) = delete; 
    NonCopyable(const NonCopyable&) = delete; 
    NonCopyable() = default; 
}; 

Affichez here pour plus de détails. Toujours manuel malheureusement, mais plus élégant que maintenant.

Questions connexes