У меня есть следующий фрагмент кода:Как использовать вектор (или другой контейнер) с классом non-copyable?
void f(){
.....
std::vector<PrepareLogFileThread> v;
for(int i = 0; i < list.length(); ++i){
PrepareLogFileThread a(
list[i],
LOG_TEMPLATE);
a.start();
v.push_back(a);
}
....
}
класса PrepareLogFileThread
наследуется от Thread
класса, который использует pthread
(мы используем C++ 98 стандарт .... и я могу использовать auto_ptr
).
Проблема заключается в том, что конструктор копирования Thread
является закрытым, так что это не испортило выполнение или что-то (я не являюсь автором этого класса).
Идея заключается в том, что я создаю свои PrepareLogFileThread
объекты, push_back
на v
, начать их, а затем они все закончить, прежде чем f
возвращается.
PrepareLogFileThread
имеет в деструкторе звонок pthread_join
, так что он заканчивается там.
Но я не могу, потому что копирую a
в соответствии с push_back
.
Как это сделать без C++ 11 и сменить конструктор копирования Thread
?
Я использую gcc 4.4.6, и могу использовать auto_ptr
.
Вам понадобится ваш собственный контейнер, который не требует копируемых типов и позволяет создавать на месте («размещение»), как контейнеры C++ 11. Или, возможно, добавьте уровень косвенности и указатели хранилища к динамическим объектам (осторожно удаляя их по мере необходимости, поскольку у вас нет подходящих интеллектуальных указателей). [Boost] (http://www.boost.org/doc/libs/1_57_0/doc/html/container.html) может помочь, если вы действительно застряли в прошлом. –