Ayuda: pasando un objeto ofstream como parametro

Iniciado por erest0r, 21 Septiembre 2014, 04:33 AM

0 Miembros y 1 Visitante están viendo este tema.

erest0r

Hola, tengo un error pero no entiendo que sucede, me arroja esta notificacion: "error: use of deleted function 'std::basic_ofstream<char>::basic_ofstream( const std::basic_ofstream<char>& )', el codigo tiene un patron parecido a este:

Código (cpp) [Seleccionar]


#include <fstream>

class miClase
{
    public:
         miClase( std::ofstream& );
    private:
         std::ofstream stream;
};

miClase::miClase( std::ofstream& tStream )
     : stream( tStream )
{

}

int main()
{
    std::ofstream mainStream( "texto.txt", std::ios::out );
    miClase pruebaClase( mainStream );
}


De antemano, gracias

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

BlackM4ster

#1
Creo que el problema es que ofstream no permite el constructor de copia. Tendrías que hacerlo por punteros o pasando el parametro del nombre de archivo:

Por punteros:
Código (cpp) [Seleccionar]
#include <fstream>

class miClase{
   public:

       miClase(std::ofstream& tStream){ stream = &tStream; };
       void Escribe(){ *stream << "Hola. Esto es una prueba\n";
                       stream->close(); }

   private:
       std::ofstream *stream;
};

int main(){

   std::ofstream mainStream("texto.txt", std::ios::out);

   miClase pruebaClase(mainStream);
   pruebaClase.Escribe();
}


Alternativa:
Código (cpp) [Seleccionar]
#include <fstream>
#include <iostream>

class miClase{
   public:

       miClase(std::string filename){ stream.open(filename, std::ios::out); }
       void Escribe(){ stream << "Hola. Esto es la prueba 2\n";
                       stream.close(); }

   private:
       std::ofstream stream;
};

int main(){

   miClase pruebaClase("texto.txt");
   pruebaClase.Escribe();
}
- Pásate por mi web -
https://codeisc.com

eferion

ofstream no dispone de constructor copia. Carece de dicho constructor porque ofstream es un buffer de escritura y, al hacer uso del constructor copia, podrías tener dos ofstream distintos apuntando al mismo fichero. Si eso llega a suceder se podrían provocar inconsistencias en el fichero.

Dicho esto tienes dos opciones, o la solución propuesta por BlackM4ster o usar un puntero para referenciar la instancia de ofstream.

erest0r

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

BlackM4ster

- Pásate por mi web -
https://codeisc.com