Имелось ввиду вот что:
Родительский процесс создает у себя хранилище строчек с путями.
При создании дочернего процесса ему передается адрес этого хранилища, куда он и будет добавлять строки.
Более гибкий вариант это инкапсулировать работу по добавлению строки в команду - обьект, который будет знать куда и как ее добавить, и передавать дочернему процессу эту команду.
Вариант 1:
typedef std::vector<std::string> string_container;
class ChildProcess
{
string_container& container;
public:
ChildProcess(string_container& cont) : container(cont) {}
void run()
{
std::string str;
//...
container.push_back(str);
//...
delete this;
}
};
class MainProcess
{
string_container strings;
public:
void run()
{
//...
ChildProcess* proc = new ChildProcess(strings);
proc->run();
//...
}
};
Вариант 2:
typedef std::vector<std::string> string_container;
class Command
{
public:
virtual ~Command() {}
virtual void doIt(std::string str) = 0;
};
class ChildProcess
{
std::auto_ptr<Command> command;
public:
ChildProcess(Command* cmd) : command(cmd) {}
void run()
{
std::string str;
//...
command->doIt(str);
//...
delete this;
}
};
class Mutex
{
public:
void Lock() { /*...*/ }
void UnLock() { /*...*/ }
};
class AddStringSynchronized : public Command
{
string_container& container;
Mutex& mutex;
public:
AddStringSynchronized(string_container& cont, Mutex& m)
: container(cont), mutex(m)
{}
void doIt(std::string str)
{
mutex.Lock();
container.push_back(str);
mutex.UnLock();
}
};
class MainProcess
{
string_container strings;
Mutex synchronizer;
public:
void run()
{
//...
ChildProcess* proc = new ChildProcess(new AddStringSynchronized( strings, synchronizer ));
proc->run();
//...
}
};
Преимущество второго варианта в том, что мы можем создавать произвольные команды, не изменяя код дочернего процесса