Три решения здесь:
1. Используйте указатели - быстрое решение состоит в том, чтобы сделать его контейнером указателей - например, shared_ptr
.
Это было бы "хорошим" решением, если ваши объекты действительно не поддаются копированию, а использование других контейнеров невозможно.
2. Другие контейнеры - В качестве альтернативы вы можете использовать не копирующие контейнеры (которые используют конструкцию на месте), однако они не очень распространены и в значительной степени несовместимы с STL. (Я пытался некоторое время, но это просто не хорошо)
Это было бы «божьим» решением, если ваши объекты действительно не поддаются копированию, а использование указателей невозможно.
[править] В C ++ 13 std :: vector позволяет создавать на месте (emplace_back) и может использоваться для не копируемых объектов, которые реализуют семантику перемещения.
[/ Править]
3. Исправьте вашу копируемость - если ваш класс копируемый как таковой, а мьютекс - нет, вам просто нужно исправить конструктор копирования и оператор присваивания.
Написание их - это боль, так как вам обычно приходится копировать и назначать всех членов, кроме мьютекса, но это часто можно упростить:
template <typename TNonCopyable>
struct NeverCopy : public T
{
NeverCopy() {}
NeverCopy(T const & rhs) {}
NeverCopy<T> & operator=(T const & rhs) { return *this; }
}
И изменение члена мьютекса на
NeverCopy<Mutex> m_mutex;
К сожалению, при использовании этого шаблона вы теряете специальные конструкторы Mutex.
[править] Предупреждение: «Исправление» копирования CTor / присваивания часто требует, чтобы вы блокировали правую сторону на конструкции копирования и блокировали обе стороны при назначении. К сожалению, нет способа переопределить копию ctor / assignment и , вызывающие реализацию по умолчанию, поэтому трюк NeverCopy
может не работать без внешней блокировки. (Существуют и другие обходные пути со своими ограничениями.)