使用istream作为参数的命名构造函数的问题

时间:2010-02-07 21:48:16

标签: c++ stream named-constructor

我正在尝试为我的类Matrix创建一个命名构造函数,输入为流,我可以从中读取初始值。

#include <istream>
// ...

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

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

该方法应该或多或少地像这样实现

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;
}

然而,在编译时,我在方法声明中遇到错误(第74行是定义原型的地方,第107行是实现开始的地方)

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

但是,在使用简单参数(如int)定义和实现命名构造函数时,我无法得到这些错误。

我错过了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

istream位于命名空间std中:

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

错误表明它一旦到达istream就会丢失。当然,在标题和来源中更改它。几个笔记:

在标题中,使用<iosfwd>代替<istream>,在源文件中使用<istream>。这更“正确”,可能会加快编译速度。

另外,你真的想要返回新分配的内存吗?这是有风险的,并不是非常安全。堆栈分配会更容易,甚至可能更快。

最后,请记住一点:你非常接近于拥有一个好operator<<。您可以根据当前功能实现它:

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

    pResult = Matrix::from_stream(pStream);

    // ... more book keeping
}