tres soluciones aquí:
1. utilizar punteros - La solución rápida es hacer que sea un recipiente de punteros - por ejemplo, a shared_ptr
.
Esa sería la "buena" solución si sus objetos no se pueden copiar, y no es posible utilizar otros contenedores.
2. Otros contenedores - Alternativamente, podría usar contenedores que no sean de copia (que usan construcción en el lugar), sin embargo, no son muy comunes y en gran medida incompatibles con STL. (Lo he intentado por un tiempo, pero simplemente no es bueno)
Esa sería la solución "divina" si tus objetos no se pueden copiar y no es posible utilizar punteros.
[edit] Con C++ 13, std :: vector permite la construcción inplace (emplace_back), y se puede usar para objetos no copiables que sí implementan la semántica de movimiento. [/ editar]
3. Fijar el copiabilidad - Si la clase es copiable como tal, y el mutex no es así, "simplemente" debe arreglar el constructor de copia y el operador de asignación.
escribirlos es un dolor, ya que por lo general tiene que copiar & asignar todos los miembros, excepto la exclusión mutua, pero que a menudo se puede simplificar:
template <typename TNonCopyable>
struct NeverCopy : public T
{
NeverCopy() {}
NeverCopy(T const & rhs) {}
NeverCopy<T> & operator=(T const & rhs) { return *this; }
}
Y cambiando miembro de exclusión mutua a
NeverCopy<Mutex> m_mutex;
Desafortunadamente, al usar esa plantilla, pierdes constructores especiales de Mutex.
[editar] Advertencia: "Reparar" la Copia CTor/asignment a menudo requiere que bloquee el lado derecho en la construcción de copia, y asegure ambos lados en la asignación. Desafortunadamente, no hay forma de anular la copia del ctor/asignación y llamar a la implementación predeterminada, por lo que el truco NeverCopy
podría no funcionar para usted sin un bloqueo externo. (Hay algunas otras soluciones con sus propias limitaciones.)
Las preguntas que dicen que "X no es aceptable" no son aceptables. –
¿Alguna sugerencia o solo punteros sin formato? ¿Qué tal shared_ptrs? – SCFrench