Pregunta

Tengo una clase que quiero hacer retroceder a una deque. El problema es que cuando retrocedo, necesito cambiar el objeto original, por lo tanto, necesito un copiador no constante. Ahora, si implemento eso, se llama a mi cst copy ctor. Si eliminé el constructor, obtengo un error de compilación acerca de que no hay controladores disponibles. ¿Cómo implemento esto de forma que pueda modificar la estructura original cuando la paso? necesito modificarlo porque la clase destruye objetos cuando está fuera de 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.

¿Fue útil?

Solución

Su problema es que un requisito fundamental de los contenedores estándar es que los objetos son construibles con copia. 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 parece a una semántica de constructor de movimientos. Es decir, después de un movimiento, el nuevo objeto posee el recurso y el objeto antiguo está vacío. Eso no es compatible con deque a partir de C ++ 03. Esa es, 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, admitirá la semántica de movimientos mediante la introducción de constructores de movimientos especiales. Hasta entonces, deberá utilizar 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 de propiedad no se libera hasta que todas las copias salgan del alcance. Considere usar boost :: shared_ptr por ejemplo, o envuélvalo en su clase, si no desea programar su propia clase administrando eso.

Otros consejos

Si no está haciendo nada dudoso con los recursos (ver otros comentarios), hacer que la variable miembro que desea cambiar mutable le permita alterarlo en una función constante.

No puedes hacer lo que intentas hacer. Tendrá que usar punteros, ya sean simples o inteligentes (pero no auto_ptr & Lt; & Gt;). ¿Por qué no puedes usar los punteros inteligentes Boost? Son bastante ligeros y deberían funcionar en todos los compiladores de C ++ razonablemente estándar. No tiene que usar todo Boost.

Dependiendo de lo que esté tratando de hacer (más detalles sería bueno), puede modificar el objeto antes / después de llamar a push_back o escribir una clase de contenedor simple que tome un puntero a su clase y se pueda insertar en un deque. Este objeto puede hacer lo apropiado para su clase en construcción / destrucción / etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top