J'ai une classe J'appellerais cette méthode comme: p> et Refonte ensuite les éléments de position avec g ++ message d'avertissement comme indiqué dans le titre. Mais la fonctionnalité est exactement ce que je le veux: retourner un tableau. Pourquoi l'avertissement existe-t-il et existe-t-il une façon "bonne" de le faire? P> p> particule code>:
POS [0] code> via
pos [2] code>. p>
5 Réponses :
Vous ne retournez pas un tableau. Il est impossible de renvoyer un tableau en C ++. Vous retournez un pointeur sur un tableau qui n'existe plus. D'où l'avertissement.
Vous pouvez faire une partie de votre classe et renvoyer un pointeur à cela. En général, je n'appellerais pas ce bon design p> Vous pouvez renvoyer un vecteur
p [3] code> sera détruit lorsqu'il est hors de portée afin de ne pas y retourner un pointeur.
Soit renvoyer un
Std :: Array
Si j'étais pédant, je dirais que p [3] code> n'a jamais existé en premier lieu ;-).
Vous ne pouvez pas renvoyer un tableau C tel que celui-ci, retourner std :: Array code> à la place:
std::array<float, 3> getPos() {
std::array<float, 3> p = {x, y, z};
return p;
}
Je suggérerais que votre fonction soit indicative d'un design médiocre. Fournissez Getter Modes Autoriser à l'utilisateur de votre classe d'accéder aux variables des membres:
class Particle { private: float x, y, z; public: float GetX() const { return x; } float GetY() const { return y; } float GetZ() const { return z; } };
Personnellement, je sauterais Dans ce cas, vous pouvez simplement déclarer: P> std :: Array Code> /
std :: vecteur code> ici, car dans votre cas particulier, la position de chaque valeur impose une signification indépendante. En général, les types de séquence ont commandé,
tuple code> S ont une structure; Si le nombre d'éléments est fixe (et souvent hétérogène) et le tri (ou la réorganisation des valeurs) est intrinsèquement absurde (par exemple, dans le cas d'une coordonnée, échangeant le
x code> et
y code > Les valeurs changent le Signification em>), puis un
tuple code> fait plus de sens.
auto [x, y, z] = a.getPos();
Duplicaté possible de Une mémoire de la variable locale peut-elle être accessible en dehors de son Portée?
Si la variable locale n'est pas statique - vous obtiendrez un comportement indéfini et très probablement un crash en runtime. Soit une instance de retour créée par un nouvel opérateur (et n'oubliez pas de libérer la mémoire via Supprimer), vous pouvez également utiliser std :: unique_ptr pour cela ... ou simplement retourner par valeur
Renvoie une copie du tableau à la place. Pensez à utiliser
std :: Array code>.
Vous retournez un pointeur sur un morceau de mémoire. Cette partie de la mémoire doit être allouée, les données doivent en être copiées, puis à un moment donné après l'utilisation du pointeur terminée, le bloc de mémoire doit être libéré. Comment vous attendez-vous que le bloc de mémoire soit libéré et comment vous attendez-vous à déterminer quand il peut être libéré?