2012-01-24 2 views
8

Quel constructeur pouvez-vous utiliser pour instancier un fstream si vous le déclarez en tant que membre d'une classe?Comment instancier un fstream si vous le déclarez en tant que membre d'une classe?

#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 = ??? 
} 

Répondre

7

Dans la nouvelle version de C++ (C++ 11), le code ci-dessus vous avez est parfaitement bien; les initialisations sont autorisées à l'intérieur du corps d'une classe.

En C++ 03 (la version précédente de C++), vous pouvez initialiser le fstream en utilisant la liste initialiseur membre comme ceci:

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

syntaxiquement, cela se fait en ajoutant deux points après le nom du constructeur mais avant l'accolade, puis la liste du nom du champ que vous voulez initialiser (ici, myFile), puis entre parenthèses les arguments que vous voulez utiliser pour l'initialiser. Cela provoquera l'initialisation correcte de myFile.

Espérons que cela aide!

+0

Pouvez-vous développer ce nouveau C++ 2011 fonctionnalité vous permettant d'utiliser « initialisations sont autorisés à l'intérieur du corps d'une classe. »? J'étais sous l'impression distincte que tous les membres sont facilement initialisés lorsque le corps du constructeur est entré ... –

+1

@ DietmarKühl- Bien sûr! En C++ 11, vous pouvez affecter des valeurs par défaut à chacun des champs d'une classe. Si elles ne sont pas remplacées par quelque chose de spécifique dans une liste d'initialisation, elles sont initialisées comme si elles étaient initialisées dans une liste d'initialisation. – templatetypedef

+0

Pas étonnant que C++ soit devenu si abstrait! – likejiujitsu

4

Une autre option est:

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

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

    //other initialization 
} 
Questions connexes