2012-01-24 4 views
8

Quale costruttore è possibile utilizzare per creare un'istanza di un flusso se lo si dichiara come membro di una classe?Come istanziare un fstream se lo dichiari come membro di una 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 = ??? 
} 

risposta

7

Nella nuova versione di C++ (C++ 11), quindi il codice di cui sopra si dispone è perfettamente bene; le inizializzazioni sono consentite all'interno del corpo di una classe.

In C++ 03 (la versione precedente di C++), è possibile inizializzare il fstream utilizzando l'elenco di inizializzazione membro come questo:

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

sintatticamente, questo è fatto con l'aggiunta di due punti dopo il nome del costruttore ma prima della parentesi graffa, quindi elencando il nome del campo che si desidera inizializzare (qui, myFile), quindi tra parentesi gli argomenti che si desidera utilizzare per inizializzarlo. Ciò farà sì che myFile venga inizializzato correttamente.

Spero che questo aiuti!

+0

Puoi espandere su questo nuovo C++ 2011 caratteristica che consente di utilizzare "inizializzazioni sono ammessi all'interno del corpo di una classe."? Avevo la netta impressione che tutti i membri siano prontamente inizializzati quando viene inserito il corpo del costruttore ... –

+1

@ DietmarKühl- Sure! In C++ 11, è possibile assegnare valori predefiniti a ciascuno dei campi di una classe. Se non vengono sovrascritti da qualcosa di specifico in un elenco di inizializzazione, vengono inizializzati come se fossero stati inizializzati in un elenco di inizializzazione. – templatetypedef

+0

Non c'è da stupirsi che il C++ sia diventato così astruso! – likejiujitsu

4

Un'altra opzione è:

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

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

    //other initialization 
}