2010-03-02 12 views

Respuesta

10

std::stack (al igual que todos los contenedores STL) requiere que su tipo contenida sea "asignable". En STL-speak, eso significa que debe tener un constructor de copia y un operator=. std::ifstream no tiene ninguno de estos.

Puede imaginarse por qué no le gustaría poder copiar y asignar flujos de E/S; la semántica de lo que debería suceder cuando hay dos copias de la misma transmisión no es obvia. ¿Debe una lectura o una copia en una copia afectar la posición de la otra copia? ¿Debería cerrar una secuencia cerca de la otra? etc.

Si quiere tener "un contenedor de std::ifstream s", entonces lo que realmente debe hacer es "un contenedor de std::ifstream* s". Los punteros no conformes son siempre asignables. La advertencia es que en este caso, por supuesto, debe asegurarse de borrar los punteros usted mismo antes de destruir el contenedor, ya que el contenedor no lo hará por usted.

+0

Sin embargo, puede tener una pila de puntero ifstream: std :: apilado s; – ALOToverflow

+0

¡Excepcional! Gracias. - Prasoon –

0

Copia de seguridad de Tyler aquí (después de votar +1).

Los contenedores STL hacen copias en todo el lugar de los objetos que les das. Si lo desea, puede tratar con esto dándoles objetos especiales con constructores de copia cuidadosamente diseñados y destructores con recuento de referencias y otras cosas.

En general, me parece demasiado problema. Solo como regla general, solo use objetos pequeños en los contenedores. Si desea crear una pila de estructuras o clases, utilice punteros en su lugar.

+0

Como regla general: 1) solo compongo (nivel superior) las clases de miembros que implementan la copia correctamente (por ejemplo, 'std :: string', no' char * '), 2) else almacenan punteros inteligentes (y hacen seguro que la clase no se puede copiar). – UncleBens

+0

Incluso si haces # 1, en mi trabajo (típicamente en tiempo real), copiar objetos grandes, o cualquier cosa que pueda implicar una asignación/desasignación dinámica, es una cosa mala. –

+0

En tal caso, probablemente utilice pools de memoria especiales, etc. (ya que no puede asignar los punteros de forma dinámica) lo que hace que el uso de C++ sea bastante específico. ¿Realmente lo considerarías un buen consejo para un principiante para evitar 'vector ' a favor de ''? IMO, la sobrecarga normalmente no importa, excepto en escenarios muy específicos. – UncleBens

2

Como las transmisiones no se pueden copiar, técnicamente puede ponerlas en contenedores estándar.

Pero podemos evitar eso al guardar punteros en la transmisión. Pero no desea almacenar punteros en las transmisiones (especialmente si están dinámicamente asignadas) en un contenedor estándar. Así que buscamos impulsar una solución.

Boost tiene el concepto de contenedores de puntero.
Esto le permite asignar dinámicamente un objeto y almacenar el puntero en el contenedor de puntero que luego toma posesión del objeto y le da acceso al objeto dinámico como si fuera el objeto (en lugar de un puntero).

Como el contenedor del puntero se apropia, no tiene que preocuparse por eliminar el objeto. El contenedor hará eso.

Dado que da acceso a los objetos contenidos como objetos en lugar de punteros, le permite usar la secuencia en algoritmos estándar de forma más natural (campared con un contenedor de punteros).

Cuestiones relacionadas