2010-04-05 10 views
5

favor, eche un vistazo a este ejemplo:C++ puntero del vector de problema/referencia

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 

class mySubContainer 
{ 
public: 
    string val; 
}; 

class myMainContainer 
{ 
public: 
    mySubContainer sub; 
}; 

void doSomethingWith(myMainContainer &container) 
{ 
    container.sub.val = "I was modified"; 
} 

int main() 
{ 
    vector<myMainContainer> vec; 


    /** 
    * Add test data 
    */ 
    myMainContainer tempInst; 

    tempInst.sub.val = "foo"; 
    vec.push_back(tempInst); 

    tempInst.sub.val = "bar"; 
    vec.push_back(tempInst); 


    // 1000 lines of random code here 

    int i; 
    int size = vec.size(); 
    myMainContainer current; 

    for(i = 0; i < size; i ++) 
    { 
     cout << i << ": Value before='" << vec.at(i).sub.val << "'" << endl; 

     current = vec.at(i); 
     doSomethingWith(current); 

     cout << i << ": Value after='" << vec.at(i).sub.val << "'" << endl; 
    } 
    system("pause");//i suck 

} 

Muchas infierno de código para un ejemplo, lo sé.

Ahora por lo que no tiene que pasar años pensando en lo que esto [debería] hacer [en]: Tengo una clase myMainContainer que tiene como único miembro de una instancia de mySubContainer. mySubContainer solo tiene una cadena val como miembro.

Así que creo un vector y lo lleno con algunos datos de muestra.

Ahora, lo que quiero hacer es: iterar a través del vector y hacer una función separada capaz de modificar el myMainContainer actual en el vector. Sin embargo, el vector se mantiene sin cambios como la salida dice:

0: Value before='foo' 
0: Value after='foo' 
1: Value before='bar' 
1: Value after='bar' 
  • ¿Qué estoy haciendo mal?

doSomethingWith tiene que volverá vacía, no puedo dejar que se devuelva el myMainContainer modificado y luego simplemente sobrescribir en el vector, por eso traté de pasarlo por referencia como se ve en la definición doSomethingWith anteriormente.

Respuesta

11

estás haciendo una copia del vector aquí:

current = vec.at(i); 

y modificar current, pero la impresión de la original, vec.at(i).

En su lugar, modifique el objeto directamente, p. Ej.

doSomethingWith(vec[i]); // or vec.at(i) for checked access. 
1
current = vec.at(i); 
doSomethingWith(current); 

Cambiar a:

doSomethingWith(vec.at(i)); 
0

Si he entendido bien, lo que sucede es que el vector almacenará copias de sus datos, no los datos directamente. Me pregunto si las respuestas sugeridas serían realmente útiles ya que la copia de los datos se haría de todos modos. Para realizar cambios en los datos, creo que debe hacer lo siguiente. 1. Almacene el puntero al objeto en lugar del objeto directamente. 2. Use los punteros para obtener el objeto y realice cambios en los datos en el puntero

Creo que eso solucionará sus problemas.

2

Modifique el lazo interno para no hacer una copia pero use una referencia y mantenga la referencia;

myMainContainer &current = vec[ i ]; 
doSomethingWith(current); 

Tenga en cuenta que, al pasar referencias, es posible que solo sean válidas siempre que no se modifique el contenedor original.