2012-01-24 9 views
8

¿Qué constructor puede usar para crear una instancia de un flujo si lo declara como miembro de una clase?¿Cómo crear una instancia de un fstream si lo declaras como miembro de una clase?

#include <fstream> 
class Foo { 
Foo(); 
// not allowed 
std::fstream myFile("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc); 

// allowed 
std::fstream myFile; 
} 

// constructor 
Foo::Foo() { 
// what form of myFile("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc) can I use here? 


myFile = ??? 
} 

Respuesta

7

En la nueva versión de C++ (C++ 11), a continuación, el código anterior que tiene es perfectamente bien; las inicializaciones están permitidas dentro del cuerpo de una clase.

En C++ 03 (la versión anterior de C++), puede inicializar el fstream mediante el uso de la lista de inicialización miembro de así:

Foo::Foo() : myFile("file-name", otherArguments) { 
    // other initialization 
} 

Syntatically, esto se hace mediante la adición de dos puntos después el nombre del constructor pero antes del corsé, luego enumerando el nombre del campo que desea inicializar (aquí, myFile), y luego entre paréntesis los argumentos que desea usar para inicializarlo. Esto causará que el myFile se inicialice correctamente.

Espero que esto ayude!

+0

¿Puede ampliar esta nueva característica de C++ 2011 que le permite utilizar "inicializaciones están permitidos dentro del cuerpo de una clase."? Tenía la clara impresión de que todos los miembros se inicializan fácilmente cuando se ingresa el cuerpo del constructor ... –

+1

@ DietmarKühl- ¡Claro! En C++ 11, puede asignar valores predeterminados a cada uno de los campos de una clase. Si no se reemplazan por algo específico en una lista de inicializadores, entonces se inicializan como si se hubieran inicializado en una lista de inicializadores. – templatetypedef

+0

¡No es de extrañar que C++ se haya vuelto tan abstruso! – likejiujitsu

4

Otra opción es:

Foo::Foo() { 
    myFile.open("\\temp\\foo.txt", fstream::in | fstream::out | fstream::trunc); 

    if(!myFile.is_open()) { 
     printf("myFile failed to open!"); 
    } 

    //other initialization 
} 
Cuestiones relacionadas