2010-02-07 13 views
1

J'essaie de créer un constructeur nommé pour ma classe Matrix, avec une entrée en tant que flux à partir de laquelle je peux lire les valeurs pour l'initialisation.Problème avec le constructeur nommé avec istream comme argument

#include <istream> 
// ... 

class Matrix 
{ 
public: 
    Matrix(int); 
    // some methods 
    static Matrix *newFromStream(istream&); 

private: 
    int n; 
    std::valarray<Cell> data; 
}; 

La méthode doit être mis en œuvre plus ou moins comme celui-ci

Matrix *Matrix::newFromStream(istream &ist) { 

    // read first line and determine how many numbers there are 
    string s; 
    getline(ist, s); 
    ... 
    istringstream iss(s, istringstream::in); 

    int n = 0, k = 0; 
    while (iss >> k) 
     n++; 
    Matrix *m = new Matrix(n);  

    // read some more values from ist and initialize   

    return m; 
} 

Cependant, lors de la compilation, je reçois une erreur dans la déclaration de la méthode (ligne 74 est l'endroit où le prototype est défini, et 107 où cependant, je ne suis pas la mise en œuvre commence)

hitori.h:74: error: expected ‘;’ before ‘(’ token 
hitori.cpp:107: error: no ‘Matrix* Matrix::newFromStream(std::istream&)’ member function declared in class ‘Matrix’ 

Ces erreurs, lors de la définition et la mise en œuvre d'un constructeur nommé avec un paramètre simple, comme un int.

Qu'est-ce qui me manque? Toute aide serait grandement appréciée.

+1

Est-ce que 'std ::'? – AndiDog

+0

oui, vous avez raison. – mvaz

Répondre

6

istream est dans l'espace de noms std:

static Matrix *newFromStream(std::istream&); 

L'erreur indique qu'il a perdu une fois qu'il est à istream. Changez-le en en-tête et en source, bien sûr. Quelques notes:

Dans votre en-tête, utilisez <iosfwd> au lieu de <istream> et dans votre fichier source, utilisez <istream>. Ceci est plus "correct" et peut accélérer la compilation.

En outre, voulez-vous vraiment retourner la mémoire nouvellement allouée? C'est risqué et n'est pas très sûr. Stack-allocation serait beaucoup plus facile, et peut-être même plus rapide.

Enfin, juste quelque chose à garder à l'esprit: Vous êtes très proche d'avoir un bon operator<<. Vous pouvez l'implémenter en fonction de votre fonction actuelle:

std::istream& operator<<(std::istream& pStream, Matrix& pResult) 
{ 
    // ... book keeping for istream 

    pResult = Matrix::from_stream(pStream); 

    // ... more book keeping 
} 
+0

et de même utiliser 'std :: istream' dans l'implémentation. – quamrana

+0

@quamrana: Généralement supposé je pense, mais je vais ajouter. – GManNickG

+0

Merci, c'était tout! Et oui, un opérateur >> devrait probablement être plus approprié. En ce qui concerne la mémoire, je ne connais que la taille de Matrix lorsque je lis la première ligne du flux. Voulez-vous dire que je devrais faire quelque chose comme Matrix m(); cin >> m; et que j'ai une sorte de méthode de redimensionnement dans 'from_stream'? – mvaz

Questions connexes