Comment “retour d'un objet” en C++?

Je sais que le titre sonne familier car il y a beaucoup de questions similaires, mais je vous demande un aspect différent du problème (je sais faire la différence entre avoir des choses sur la pile et de les mettre sur le tas).

En Java, je peux toujours retourner des références à des "locaux" objets

public Thing calculateThing() {
    Thing thing = new Thing();
    //do calculations and modify thing
    return thing;
}

En C++, pour faire quelque chose de similaire, j'ai 2 options

(1) je peux utiliser des références à chaque fois que j'ai besoin de "retour" d'un objet

void calculateThing(Thing& thing) {
    //do calculations and modify thing
}

Puis l'utiliser comme ceci

Thing thing;
calculateThing(thing);

(2) Ou je peux retourner un pointeur vers un objet alloué dynamiquement

Thing* calculateThing() {
    Thing* thing(new Thing());
    //do calculations and modify thing
    return thing;
}

Puis l'utiliser comme ceci

Thing* thing = calculateThing();
delete thing;

En utilisant la première approche que j'ai de ne pas avoir à libérer de la mémoire manuellement, mais pour moi, cela rend le code difficile à lire. Le problème avec la deuxième approche est, je me souviens de delete thing;, qui n'a pas l'air très agréable. Je ne veux pas retourner une valeur copiée parce qu'il est inefficace (je pense), donc voici les questions

  • Est-il une troisième solution (qui ne nécessite pas de copie de la valeur)?
  • Est-il un problème si je m'en tiens à la première solution?
  • Quand et pourquoi devrais-je utiliser la deuxième solution?
  • +1 pour bien mettre la question aux voix.
  • Très pédant, c'est un peu imprécis de dire que "les fonctions de retourner quelque chose". Plus précisément, l'évaluation d'un appel de fonction produit une valeur. La valeur est toujours un objet (sauf si c'est une fonction void). La distinction est que la valeur est une glvalue ou un prvalue -- qui est déterminé par déclarée type de retour est une référence ou pas.
InformationsquelleAutor phunehehe | 2010-07-28