assignment - c++ push_back, constructor de copias no const
copy constructor struct c++ (4)
No puedes hacer lo que intentas hacer. Deberá usar punteros, ya sean simples o inteligentes (pero no auto_ptr <>). ¿Por qué no puedes usar los punteros inteligentes Boost? Son bastante livianos y deberían funcionar en todos los compiladores de C ++ razonablemente estándar. No tiene que usar todo Boost.
Tengo una clase que quiero push_back en una deque. El problema es que cuando retrocedo necesito que se cambie el objeto original, así que necesito una copiadora sin const. Ahora si implemento que se llame mi const copy ctor. Si eliminé la interfaz, aparece un error de compilación sobre no disponibles ctors. ¿Cómo implemento esto de forma que pueda modificar la estructura original cuando la paso? Necesito modificarlo porque la clase destruye objetos cuando se sale del alcance y me gustaría decirle que no lo haga cuando haya otra instancia alrededor. No puedo usar boost ya que mi plataforma no lo admite.
Su problema es que un requisito fundamental de los contenedores estándar es que los objetos son copiables. Eso no solo significa que tienen un constructor de copia, sino que también significa que si copia el objeto, la copia y el original son los mismos.
Sin embargo, su objeto se asemeja a una semántica move-constructor. Es decir, después de un movimiento, el nuevo objeto posee el recurso y el objeto viejo está vacío. Eso no es compatible con deque a partir de C ++ 03. Es decir, por cierto, la misma razón que prohíbe poner auto_ptr en un contenedor.
La próxima versión de C ++, llamada c ++ 0x, soportará esa semántica de movimiento introduciendo constructores de movimiento especiales. Hasta entonces, deberá usar un objeto que comparta la propiedad cuando desee colocarlo en un contenedor estándar. Eso significa que si copia su objeto y el original queda fuera del alcance, el recurso propio no se libera hasta que todas las copias quedan fuera del alcance. Considere el uso de boost :: shared_ptr por ejemplo, o envuélvalo en su clase, si no desea programar su propia clase administrando eso.
Si no está haciendo nada dudoso con los recursos (ver otros comentarios), hacer que la variable miembro que desea cambiar sea mutable le permitirá modificarla en una función const.
Dependiendo de lo que esté intentando hacer (más detalles serían agradables), puede modificar el objeto antes / después de llamar a push_back
o escribir una clase contenedora simple que tome un puntero a su clase y pueda insertarse en una deque
. Este objeto puede hacer lo apropiado para su clase en construcción / destrucción / etc.