-1
votes

L'adresse de la variable locale renvoyée - peut ignorer l'avertissement sans détriment, mais quelle est la bonne voie?

J'ai une classe particule : xxx

J'appellerais cette méthode comme: xxx

et Refonte ensuite les éléments de position avec POS [0] via pos [2] .

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?


4 commentaires

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 .


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é?


5 Réponses :


1
votes

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 xxx

Vous pouvez renvoyer un vecteur . Vous pouvez renvoyer un tableau à la place. Vous pouvez vous demander pourquoi vous avez besoin de cela.


0 commentaires

0
votes

p [3] sera détruit lorsqu'il est hors de portée afin de ne pas y retourner un pointeur. Soit renvoyer un Std :: Array par valeur ou envisagez de faire une classe pour les positions et renvoyez un objet de position, ou une référence à celle-ci. Exemple: xxx


1 commentaires

Si j'étais pédant, je dirais que p [3] n'a jamais existé en premier lieu ;-).



2
votes

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;
}


0 commentaires

0
votes

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; }
};


0 commentaires

1
votes

Personnellement, je sauterais 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.

Dans ce cas, vous pouvez simplement déclarer: P>

auto [x, y, z] = a.getPos();


0 commentaires