Question

Cela peut être une question stupide, mais ...

J'ai écrit un certain nombre de classes qui utilisent des éléments non copiables. Ces classes ne sont jamais initialisées par le constructeur de copie dans ma source. Lorsque je tente de compiler sans fournir mon propre constructeur de copie, g ++ jette beaucoup d'erreurs sur la façon dont il ne peut pas construire un constructeur de copie par défaut, en raison des objets non membres copiables.

Est-il possible de dire que le compilateur tout simplement pas me donner un constructeur de copie?

EDIT: Ouais ... se sent stupide ... J'ai eu un cas où j'invoquait la copie-constructeur par accident dans un appel boost :: bind. Leçon apprise.

Était-ce utile?

La solution

Si vous ne causez pas réellement le constructeur de copie à appeler alors il n'est pas une erreur si le compilateur serait incapable de générer un. On dirait que vous êtes (peut-être indirectement) provoquant le constructeur de copie à utiliser.

Vous pouvez supprimer le compilateur a généré une en déclarant votre constructeur de copie (vous n'avez pas besoin de définir si vous ne l'utilisez pas). Vous pouvez le placer dans la section private de votre classe.

Si cela change l'erreur de dire que le constructeur de copie est inaccessible ou si vous obtenez des erreurs de lien alors vous êtes vraiment causez la copie-construtor à utiliser et vous avez besoin d'analyser pourquoi.

Autres conseils

La façon habituelle de faire les choses noncopyable est de déclarer, mais pas définir un constructeur de copie, et le rendre privé donc rien ne peut l'appeler.

La prochaine révision de la langue fournira une de manière explicite de supprimer ces fonctions générées .

Non dans la version actuelle de C ++. En C ++ 0x, il y aura une syntaxe =delete; pour lui dire que vous ne voulez pas l'une des fonctions membres spéciales, le compilateur génère par défaut si vous ne vous un pas défini.

Jusqu'à ce que la nouvelle norme C ++ 0x est entièrement pris en charge, le mieux que vous pouvez faire est de delclare une version de la fonction de membre spécial, mais pas les mettre en œuvre. Normalement, ils sont faits privés (pour aider à faire comprendre qu'ils ne doivent pas être utilisés).


Class foo
{
    // ... rest of definition
    private:
        foo (const foo& rhs); // Do Not Implement
        const foo& operator= (const foo& rhs); // Do Not Implement
};

Non :)

Si vous voulez que votre classe soit utiliser incopiable quelque chose comme boost::noncopyable

class MyClass : private boost::noncopyable
{

}

ou utiliser une macro parametrizied dans votre définition de classe qui déclare un constructeur de copie privée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top