Смотрите на этот пример:
#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
}
Партия ада кода для примера, я знаю.
Теперь, таким образом, Вы не должны проводить годы, думая о том, что это [должно] сделать [es]: у Меня есть класс myMainContainer
который имеет как его единственный участник экземпляр mySubContainer
. mySubContainer
только имеет строку val
как участник.
Таким образом, я создаю вектор и заполняю его некоторыми демонстрационными данными.
Теперь, то, что я хочу сделать: Выполните итерации через вектор и сделайте отдельную функцию способной изменить текущий myMainContainer в векторе. Однако вектор остается неизменным, как говорит вывод:
0: Value before='foo'
0: Value after='foo'
1: Value before='bar'
1: Value after='bar'
doSomethingWith должен возвратиться пусто, я не могу позволить ему возвратить измененный myMainContainer
и затем просто перезапишите его в векторе, вот почему я пытался передать его ссылкой, как замечено в doSomethingWith определении выше.
Здесь вы делаете копию вектора:
current = vec.at( i );
и изменяете current
, но печатаете оригинал, vec.at (i)
.
Вместо этого измените объект напрямую, например
doSomethingWith(vec[i]); // or vec.at(i) for checked access.
current = vec.at(i);
doSomethingWith(current);
Измените его на:
doSomethingWith(vec.at(i));
Измените внутренний цикл, чтобы не делать копию, а использовать ссылку и поддерживать ссылку таким образом;
myMainContainer ¤t = vec[ i ];
doSomethingWith( current );
Имейте в виду, что при передаче ссылок они возможно, только до тех пор, пока исходный контейнер не изменен.
Если я правильно понимаю, происходит следующее: vector будет хранить копии ваших данных, а не данные напрямую. Интересно, будут ли предложенные ответы действительно полезны, поскольку в любом случае будет сделана копия данных. Чтобы внести изменения в данные, я думаю, вам необходимо сделать следующее. 1. Сохраните указатель на объект, а не непосредственно на объект. 2. Используйте указатели, чтобы получить объект и внести изменения в данные по указателю
Я думаю, это решит ваши проблемы.