Il existe un moyen de déclarer Copy Constructor non public AND en utilisant le constructeur de copie par défaut?

StackOverflow https://stackoverflow.com/questions/269241

  •  06-07-2019
  •  | 
  •  

Question

J'ai une classe pas si petite en développement (qu'elle change souvent) et je n'ai pas besoin de fournir de constructeur de copie publique ni d'attribution de copie. La classe a des objets avec la sémantique des valeurs, donc la copie et l’affectation par défaut fonctionnent.

la classe est dans une hiérarchie, avec des méthodes virtuelles, je fournis donc un Clone () virtuel pour éviter le découpage en tranches et pour effectuer une "copie polymorphe".

Je ne veux pas déclarer l'assignation de copie et la construction protégées ET les définir (et rester synchronisées avec les modifications) à moins que je ne fasse quelque chose de spécial.

Est-ce que quelqu'un sait s'il y a un autre moyen?

merci!

UgaSofT

Était-ce utile?

La solution

Un objet issu d’une hiérarchie polymorphe et avec une sémantique de valeur? Quelque chose ne va pas ici.

Si vous avez vraiment besoin que votre classe ait une sémantique de valeur, jetez un œil à l'idiome Envelop-Letter Id de J.Coplien ou à cet article sur les objets normaux [1].

[1] Sean Parent. & # 8220; Au-delà des objets & # 8221 ;. Comprendre le logiciel que nous écrivons. http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations. Connexions C ++. Nov 2005.

HTH,

Autres conseils

Je ne pense pas que rien dans le langage C ++ vous permette de le faire. Bien que j'aimerais bien me tromper sur ce point.

Je l'ai déjà rencontré par le passé et j'ai proposé la solution suivante. Asumme la classe est C1.

  1. Définissez une classe interne privée appelée Data
  2. Je mettrais tous mes membres dans la C1 plutôt que sur les données
  3. Définissez un constructeur de copie protégée qui copie simplement les instances de données entre C1.

Cette approche présente quelques inconvénients. À savoir, cela semble un peu non naturel et élimine l'accès direct au champ (peut être atténué avec de petites fonctions d'accesseur).

C’est une façon détournée de faire ce que vous cherchez, mais vous évitez d’écrire manuellement le constructeur de copie.

J'ai peut-être trouvé une solution ...

Je peux mettre dans ma classe de base racine (ou je peux créer une petite classe d'interface, sans données membres et effectuer plusieurs héritages) le constructeur de copie protégée qui est vide ici. Je ne redéfinis pas le Copy Ctor dans les classes dérivées. Maintenant, le copieur par défaut n'est pas accessible aux clients (parce que la base n'est pas accessible) mais fonctionne par défaut!

Il y a des objections?

Si vous pouvez utiliser C ++ 0x ...

class A
{
    protected:
        A(const A&) = default;
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top