2009-03-07 9 views
2

Comment pourrais-je obtenir mes variables sur un vecteur?Comment accéder aux variables du vecteur <struct> * obj?

Je ne peux pas utiliser les opérateurs d'insertion binaire ou les opérateurs égaux.

Plus tôt, je déclarai un vector<someStruct> *vObj et alloué, puis retourné la vObj et l'a appelé dans cette fonction:

vector<sameStruct> firstFunc(); 

for (unsigned int x = 0; x < v->size(); x++) 
{ 
    v[x]; 
} 

quand je le débugger, v[x] a maintenant le contenu complet du vecteur d'origine, comme c'était déjà le cas sans l'indice/index.

Mais je ne pense pas avoir fait quoi que ce soit pour aller au-delà. J'ai juste environ 4 variables à l'intérieur de mon vecteur; quand je le débogue, il a l'information dont j'ai besoin, mais je ne peux pas y arriver.

Répondre

2

Comme il est écrit v est un pointeur vers un vecteur de structures.

Lorsque vous indexez directement dans v tout ce que vous faites est un arithmétique de pointeur. v [x] est le vecteur des structures à la position x (en supposant que v est un tableau si c'est juste un seul objet à la fin du pointeur alors v [x] pour x> 0 est juste garbage). C'est parce qu'il applique le [x] non au vecteur pointé par v mais au pointeur v lui-même.

Vous devez déréférencer le pointeur et l'index dans le vecteur en utilisant quelque chose comme:

(*v)[x]; 

À ce stade, vous avez une référence à l'objet à la position Xème du vecteur pour obtenir à ses fonctions membres/variables utilisent:

(*v)[x].variable; 

ou

(*v)[x].memberfunction(parameters); 

Si vous d o veulent pas déréférencer le vecteur accès alors l'élément dans ce que vous pouvez essayer quelque chose comme:

v->at(x); 
v->at(x).variable; 
v->at(x).memberfunction; 

De cette façon, vous accédez à une fonction de membre d'un objet exactement de la même manière que lorsque vous avez appelé:

v->size(); 

J'espère que cela aide.

1

Pour utiliser l'opérateur [] pour accéder à des éléments, vous devez le faire sur un objet et non sur un pointeur.

Essayez;

(*vec)[x]; 

E.g.

for (int i = 0; i < vec->size(); i++) 
{ 
    printf("Value at %d is %d\n", i, (*vec)[i]); 
} 

Notez que lorsque vous appelez des fonctions sur un pointeur que vous utilisez habituellement le - opérateur> au lieu du . opérateur, mais vous pouvez facilement faire (* vec) .some_func(); au lieu.

Les opérateurs tels que [], -, ++, etc. peuvent agir à la fois sur des objets et des pointeurs. Avec les objets, ils agissent comme des appels de fonction, mais sur les pointeurs, ils agissent comme des opérations mathématiques sur l'adresse.

Par exemple; Avoir exactement le même effet - ils renvoient le nième objet depuis le début du pointeur. (Notez l'emplacement du * dans le second exemple, il est appelé après le décalage est appliqué

Deux autres conseils;.

Vous pouvez également éviter la nécessité de déréférencement comme celui-ci en passant le vecteur comme référence, pas un pointeur. ce n'est pas toujours une option appropriée mais il ne conduit à un code plus propre.

void my_func(std::vector<int>& vector) 
{ 
    // vector can then be used as a regular variable 
} 

Si vous allez à passer des vecteurs d'un type spécifique aux fonctions beaucoup, vous pouvez utiliser un typedef à la fois pour plus de clarté et pour économiser en tapant

typedef std::vector<int> IntVector; 

void my_func(IntVector& vector) 
{ 
} 
Questions connexes