2009-09-27 9 views
0

J'essaie actuellement d'initialiser une variable istream privée en classe. La définition de classe ressemble à:Initialisation d'un membre de données istream privé en C++

#define PARSER_H 

class parser { 
    public: 
    parser(); 
    parser(string predict_table_file_name); 
private: 
    int getMaxRHS(string predict_table_file_name); 
    int getMaxPairs(string predict_table_file_name); 
    int getMaxPairsY(string predict_table_file_name); 
    int getMaxRHSY(string predict_table_file_name); 
    int getMaxSymbols(string predict_table_file_name); 
    int getGoalSymbol(string predict_table_file_name); 
    int getNumberOfTerminalSymbols(string predict_table_file_name); 
    string getSymbol(int symbolID); 
    string getToken(); 
    string openFile(string sourceFile); 
    bool isTerminalSymbol(string token, string symbolArray[], int terminalSymbols); 
    istream scanFile; 
}; 

#endif 

La variable en question est "istream Scanfile". Le code que j'utilise pour essayer de l'initialiser ressemble à ceci.

string parser::openFile(string sourceFile) { 
    filebuf fb; 
    fb.open(sourceFile.c_str(), ios::in); 
    parser::scanFile(&fb); 
} 

La ligne "analyseur :: Scanfile (& fb);" me donne le problème. Apparemment, le compilateur pense que j'essaie d'appeler la fonction, ce que je suppose, mais je veux juste appeler le constructeur sur parser :: scanFile. Je suis nouveau en C++, donc toute aide serait grandement appréciée.

+0

Je pense que vous n'avez pas besoin de stocker istream dans votre classe du tout. Vous voulez probablement stocker les résultats de l'analyse pas les données source (que le membre scanFile est). Vous devriez avoir une méthode appelée parseData (istream & in) qui analyse les données et enregistre les résultats dans la structure ou les variables dont vous avez besoin. Si vous avez besoin de stocker les données source de l'analyseur, pourquoi ne pas les lire dans un tampon (par exemple std :: string) - vous pouvez alors stocker le tampon au lieu du flux d'entrée. – Wacek

Répondre

-1

Vous voulez quelque chose comme:

parser::scanFile = istream(&fb); 

pour appeler le constructeur.

+0

Malheureusement, cela ne fonctionnera pas. 'istream' n'a pas de constructeur par défaut, vous devez donc l'initialiser dans la liste d'initialisation du constructeur - vous ne pouvez pas l'initialiser par affectation. – hrnt

+0

Même si 'scanFile' était correctement construit, cela ne fonctionnerait pas car' istream' n'a pas de 'operator =' défini. – hrnt

0

Vous devez effectuer une telle initialisation dans la liste d'initialisation du constructeur. Pourquoi voulez-vous implémenter openFile en tant que fonction séparée?

De même, si scanFile est utilisé pour lire des fichiers, pourquoi ne pas utiliser ifstream à la place?

Allez-vous créer des analyseurs qui ne sont pas associés à des fichiers? Sinon, essayez ceci pour le constructeur:

parser(string sourceFile) : scanFile(sourceFile.c_str()) { ... other constructor stuff ... }

Cela suppose que Scanfile est un ifstream. L'utilisation d'un istream est plus complexe. Votre code d'origine n'aurait pas fonctionné, car le fichier est détruit lorsque vous quittez la fonction openFile.

0

Vous ne pouvez pas, car l'objet est déjà construit. Mais vous pouvez

scanFile.rdbuf(&fb); 

mais qui ne fera pas non plus, parce que fb sera détruite dès que vous revenez de la openFile. Mais vous devrez résoudre ce problème vous-même, car c'est votre flux de code.

1

Pour résoudre votre question vous pouvez ajouter le fichier comme variable membre.

class parser 
{ 
    // STUFF LIKE BEFORE 
    filebuf fb; 
    istream scanFile; 
}; 

parser::parser() 
    :fb() 
    ,scanFile(&fb) 
{} 

string parser::openFile(string sourceFile) 
{ 
    fb.open(sourceFile.c_str(), ios::in); 
} 

Mais vous devriez probablement utiliser un objet fstream:

class parser 
{ 
    // STUFF LIKE BEFORE 
    ifstream scanFile; 
}; 

parser::parser() 
    :scanFile() 
{} 

string parser::openFile(string sourceFile) 
{ 
    scanFile.open(sourceFile.c_str()); 
} 

voir: http://www.cplusplus.com/reference/iostream/fstream/

Questions connexes