Pregunta

¿Por qué no el siguiente trabajo:

#include <iostream>
#include <fstream>
#include <stack>

std::stack<std::ifstream> s;

-PT

¿Fue útil?

Solución

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

Puede imaginar por qué no le gustaría ser capaz de copiar y asignar I / O arroyos; la semántica de lo que debería ocurrir cuando hay dos copias de la misma corriente no son obvias. En caso de una lectura o escritura en una copia afectar a la posición de la otra copia? En caso de cierre de una corriente cerca de la otra? etc.

Si usted quiere tener "un recipiente de std::ifstreams", entonces lo que realmente debe hacer es "un recipiente de std::ifstream*s". punteros const no siempre son asignables. La advertencia es que en este caso, por supuesto, usted tiene que asegurarse de que elimina los punteros a sí mismo antes destruyendo el contenedor, ya que el contenedor no lo hará por usted.

Otros consejos

Debido a que las corrientes no son copiables puede tecxhnicaly las puso en contenedores estándar.

Sin embargo, podemos conseguir alrededor de eso por storeing punteros a la corriente. Pero usted no desea almacenar punteros a flujos (especialmente si se asignan dinámicamente) en un contenedor estándar. Así que miramos al impulso de 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 asume la propiedad del objeto y le da acceso al objeto dinámico como si fuera el objeto (en lugar de un puntero).

Debido a que el contenedor de puntero toma la propiedad Don; t necesidad de preocuparse acerca de cómo eliminar el objeto. El contenedor que va a hacer.

Debido a que da acceso a los objetos contenidos como objetos en lugar de punteros que le permite utilizar la corriente en los algoritmos estándar en un fashon más natural (campared con un contenedor de punteros).

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

Los contenedores STL hacen copias por todo el lugar de los objetos que les dan. Si lo desea, puede hacer frente a este dándoles objetos especiales con los constructores de copia cuidadosamente elaborado y destructurs con el recuento de referencias y otras cosas.

En general, me parece que demasiado problema. Así como regla general, sólo utilice objetos pequeños en los contenedores. Si desea hacer una pila de estructuras o clases, el uso punteros a ellos en su lugar.

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