Que doit faire un C++ getter retour

Quelle est la meilleure pratique pour un C++ méthode de lecture qui est censé renvoyer un non trivial type, mais un membre qui est de type classe ou structure.

  1. Retour par valeur, tels que: MyType MyClass::getMyType() { return mMyType; }
  2. Retour par référence const: const MyType& MyClass::getMyType() { return mMyType; }
  3. Retour par adresse: MyType* MyClass::getMyType() { return &mMyType; }

class MyType { /* ... */ };

class MyClass
{
  private:
     MyType mMyType;
}

J'ai particulièrement s'inquiéter de la suite des usages de cette méthode. Pouvez-vous veuillez donner des précisions dans les détails de la façon dont cela peut affecter la copie de l'objet, et le danger de dangling références et sauvage disparu des pointeurs si function() veut l'enregistrer pour une utilisation ultérieure.

MyType* savedPointer;

SomeType function(MyType* pointer) { savedPointer = pointer; };

un. valable pour 1. et 2.

{
  MyType t = myClass.getMyType();
  function(&t);
}

//is savedPointer still valid here?

b. valable pour 1. et 2.

{
  const MyType& t = myClass.getMyType();
  function(&t);
}

//is savedPointer still valid here?

c. valable pour 1. et 2.

{
  MyType& t = myClass.getMyType();
  function(&t);
}

//is savedPointer still valid here?

d. valable pour 3.

{
  MyType* t = myClass.getMyType();
  function(t);
}

//is savedPointer still valid here?

myClass est un objet de type MyClass.

  • Il dépend du contexte. Voulez-vous voir les modifications à l'intérieur de la classe (par exemple, modifier un élément du vecteur) ou voulez-vous exlicitely seulement la valeur, mais jamais(!) avez des modifications à l'original? À mon avis, le pointeur ne doit pas être utilisé en général. Les types de conteneurs devrait retourner par ref ou const ref et le reste par la valeur (ou même pas de lecture du tout!). Le point de classes encapsulation des données (entre autres fonctions). Revenant toujours par des non-const de référence serait ridicule.
  • Vous pouvez également retourner les pointeurs intelligents, qui permettent d'économiser que vous beaucoup de s'inquiéter...
  • Vous ne pouvez pas retourner un pointeur intelligent ici. Il n'est pas alloué dynamiquement un objet (on ne devrait pas l'être).
  • d'accord, de renvoyer un pointeur intelligent de la variable d'instance doit être un pointeur intelligent, c'est ce que je voulais dire
  • Mais pourquoi voudriez-vous faire de la variable d'instance un pointeur intelligent?
  • bien il existe de nombreuses situations où il est justifié, peut-être pas ici, mais compte tenu de l'OP était inquiet de la mise en danger de dangling références et sauvage disparu pointeurs, j'ai pensé à mentionner des pointeurs intelligents serait adéquat.
  • Il y a très, très peu de situations où une smart pointeur de membre est justifiée (sauf peut-être unique_ptr, mais dans ce cas, vous ne voulez pas retourner une "copie" de la unique_ptr).
  • laissez-nous continuer cette discussion dans le chat
  • Il n'y a pas "doit" répondre à votre question. Cela dépend de votre intention, le niveau d'accès vousune re prêts à fournir et combien détails d'implémentation, vous êtes prêt à exposer. Voir ici pour une réponse plus détaillée: stackoverflow.com/a/2977172/187690

InformationsquelleAutor Ferenc Deak | 2013-11-20