Wie man einen Dateistream als Klassenmitglied hat

Ich habe die folgende Parser-Klasse, die in Visual C ++ funktioniert

class Parser
{
   private:
   const char* filename;
   std::ifstream filestream;
   std::vector<std::string> tokens;
   unsigned int linect;

   public:
   Parser(const char* filename);
   bool readline();
   std::string getstrtoken(unsigned int i) const { return tokens[i]; }
   int getinttoken(unsigned int i) const { return atoi(tokens[i].c_str()); }
};

Parser::Parser(const char* filename) :
   filename(filename),
   linect(0)
{
   filestream = ifstream(filename); // OK in VC++, not with GCC?
}

bool Parser::readline()
{
   std::string line;
   getline(filestream, line);
   std::stringstream ss(line);
   std::string token;

   tokens.clear();
   while(getline(ss, token, ' ')){ if(token != "") tokens.push_back(token); }
   linect++;
   return (filestream != NULL);
}

Aber wenn ich versuche, es mit GCC 4.8.2 zu kompilieren, erhalte ich die Fehlermeldung, dass ich es nicht zuordnen kannfilestream. Nach dem, was ich an anderer Stelle auf dieser Website gelesen habe, können Sie dies tun

std::ifstream filestream(filename);

aber das kannst du nicht

std::ifstream filestream;
filestream = ifstream(filename);

Das ist im Wesentlichen das, was ich tun muss, wenn ich deklarieren möchtefilestream als Mitglied derParser Klasse und initialisieren Sie es im Konstruktor.

Ich möchte, dass der Dateistream in der Datei gespeichert wirdParser Klasse, damit diejenigen, die den Parser verwenden, ihn nicht deklarieren und nachverfolgen müssen. Es scheint mir, dass dies in sich geschlossen sein sollteParser Klasse, da ihre internen Methoden (z.readline()) sind die einzigen, die es benutzen.

Gibt es eine Möglichkeit, dies zu erreichen, die auf beiden Plattformen funktioniert?

Vielen Dank.

bearbeiten: Mein Fix war, das explizit aufzurufenopen() Methode vonifstream. Mein Parser-Klassenkonstruktor sieht jetzt so aus:

Parser::Parser(const char* filename) :
   filename(filename),
   linect(0)
{
   filestream.open(filename);
   // Do some checking to make sure the file exists, etc.
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage