Пожалуйста, посмотрите на этот пример:
#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 должен вернуть void, я не могу позволить ему вернуть измененный myMainContainer
, а затем просто перезаписать его в векторе, поэтому я попытался передать его по ссылке, как видно из определения doSomethingWith выше.