Quand à retourner un pointeur, scalaire et de référence en C++?

Je me déplace à partir de Java-C++ et je suis un peu confus de la langue de la flexibilité. Un point est qu'il existe trois façons de stocker des objets: Un pointeur, une référence et un scalaire (stockage de l'objet lui-même, si je comprends bien).

J'ai tendance à utiliser des références si possible, parce que c'est proche de Java que possible. Dans certains cas, par exemple, des getters pour les dérivés attributs, ce n'est pas possible:

MyType &MyClass::getSomeAttribute() {
    MyType t;
    return t;
}

Cela ne compile pas, parce que t existe que dans le cadre de getSomeAttribute() et si je retourne une référence à elle, elle aurait point de nulle part avant que le client puisse l'utiliser.

Donc je suis parti avec deux options:

  1. Retourner un pointeur
  2. Retour un scalaire

Retournant un pointeur devrait ressembler à ceci:

MyType *MyClass::getSomeAttribute() {
    MyType *t = new MyType;
    return t;
}

Ce serais de travail, mais le client devra vérifier ce pointeur pour NULL pour être vraiment sûr, quelque chose qui n'est pas nécessaire avec les références. Un autre problème est que l'appelant aurait assurez-vous que t est libéré, je préfère ne pas traiter que si je peux l'éviter.

L'alternative serait de revenir à l'objet lui-même (scalaire):

MyType MyClass::getSomeAttribute() {
    MyType t;
    return t;
}

Qui est assez simple et tout ce que je veux dans ce cas: Il se sent comme une référence et il ne peut pas être null. Si l'objet est hors de portée dans le code du client, il est supprimé. Assez pratique. Cependant, j'ai rarement vu quelqu'un le faire, est-il une raison pour que? Est-il une sorte de problème de performance si je retourne un scalaire au lieu d'un pointeur ou une référence?

Ce qui est le plus commun/approche élégante pour gérer ce problème?

  • "Je me déplace à partir de Java C++" ne signifie rien. Java n'est pas du C++. Java ne sera jamais en C++. La réflexion sur Java lors de la programmation C++ ne va pas vous aider à comprendre C++ ou vous aider à prendre les bonnes décisions. Aucune langue ne sera pas vous aider programme C++ à l'exception de C++, donc, oubliez vous connaissez d'autres langues, parce qu'ils ne sont pas en C++. Vous avez à apprendre le C++ si vous souhaitez programmer en C++, et ne pas essayer de transformer un langage préexistant en C++, parce que cela ne fonctionne pas seulement comme C++ c'est du C++. pourrais-je vous suggérer un bon livre?
  • Une référence n'est pas proche de ce que Java n'. Le plus proche de la langue de construire à Java serait de retourner un pointeur. Mais qui ne prend pas en compte pour la gestion de la mémoire. Donc le plus proche de C++ construire pour Java serait de retourner un pointeur partagé. std::tr1::shared_ptr<T> (ou std::shared_ptr<T> ou boost::shared_ptr (en fonction de la version que vous utilisez)). Vous pouvez de nouveau et d'oublier à votre contenu de coeurs et généralement l'objet sera nettoyée correctement. Mais le C++ n'est pas Java. Vous avez besoin d'apprendre comment les utiliser correctement. N'apportez pas de Java, notions de C++ les langues sont simplement différentes.
  • Ok, donc C++ n'est pas Java, mais en ignorant les spécificités de la langue. les idées exprimées dans le Java peut être traduite en C++. J'ai souvent programme dans un certain nombre de langues, souvent la syntaxe diffère, mais pas de la sémantique.
  • ce n'est pas "nécessairement", et dans ce cas, il n'est pas juste de la sémantique. "Idées" est un terme générique, votre argument n'est ni falsifiable ou significatives. C++ et Java sont des langues différentes, et vous faites les choses de différentes manières. Les "idées" qui correspondent à des règles de base comme l'exécution d'instructions, et rien vous dire sur les choix de conception.
  • C'est une idée fausse.
  • À l'aide de "Analyse Comparative" est très humaine et très fréquent. J'ai trouvé que c'était un excellent outil pour aider à enseigner aux gens. Je ne comprendrai jamais le "suivre le troupeau, fermé d'esprit" approche.
  • Vous n'avez pas à vérifier le retour de new NULL ou nullptr. new est garanti pour lever une exception sur l'échec d'allocation.

InformationsquelleAutor theone | 2010-08-07