2017-04-12 1 views
3

I ont le code suivant:la boucle C de travers les objets et obtenir leur adresse

vector<shape*> triangle_ptrs; 
for (auto x : triangles) 
    triangle_ptrs.push_back(&x); 

triangle est une classe dérivée de shape classe, et triangles est un std::vector de triangles:

std::vector<triangle> triangles; 

I besoin de sauvegarder les adresses des triangles, mais comme je boucle la collection, leurs adresses semblent être les mêmes. Comment puis-je contourner cela?

+3

'x' est une copie du triangle que vous bouclez. Utilisez 'auto & x' pour obtenir une référence au triangle d'origine et obtenir le pointeur que vous voulez. – nwp

+0

Veuillez étendre votre publication avec un [exemple minimal, vérifiable et complet] (https://stackoverflow.com/help/mcve). –

+0

'auto & x' au lieu de' auto x' dans la boucle à distance – Raxvan

Répondre

6

Dans cette boucle:

for (auto x : triangles) 
    triangle_ptrs.push_back(&x); 

qui est logiquement égale à:

for (auto it = triangles.begin(), it != triangles.end(); ++it) { 
    auto x = *it; 
    triangle_ptrs.push_back(&x); 
} 

vous faites une copie à chaque itération, changer votre boucle:

for (auto &x : triangles) 
    triangle_ptrs.push_back(&x); 
1

Vous êtes obtenir l'adresse d'une variable temporaire locale, changer le type de x pour être auto& alors vous obtenez une référence aux éléments vectoriels.