将istream参数传递给类构造函数的问题

时间:2009-10-31 23:26:36

标签: c++

我的头文件中有以下代码:

class Factovisors {

    public:
        Factovisors(std::istream& strm):strm_(strm)
        {

        }
        void run()
        {
            unsigned int n,m;
            while (!strm_.eof()) {
            strm_ >> n >> m;

            if (isFact(n,m))
                std::cout << m << " divides " << n << "!\n";
            }
        }

        std::istream strm_;

};

我的.cpp文件包含以下代码。

 std::ifstream strm("factovisor.test");

    Factovisors   facto(strm);

    facto.run();

    strm.close();

我的编译器给出的错误是:

std::ios::basic_ios(const std::ios &) is not accessible from
std::istream::basic_istream(const std::istream &)

我想我错过了一些非常明显的东西。所以任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:4)

问题是istream是一个“界面”。它具有纯虚函数,因此拥有它的副本是没有意义的。你可能会做的是保持对传递的流的引用:

std::istream& strm_;

strm_可以是ifstreamistringstream或来自istream的任何输入流。

答案 1 :(得分:2)

您无法复制构造流,因为基类ios的副本ctor是私有的。尝试将流成员作为引用,而不是独立的对象。

答案 2 :(得分:2)

您正在尝试存储流的副本。这不起作用,因为流不可复制。你可以做的最好的是存储引用或指针。

但是,如果只有一种方法将使用该流,则只需传递对此方法的引用。

其他问题:

        while (!strm_.eof()) {
        strm_ >> n >> m;

        if (isFact(n,m))

当尝试读取数据因此失败时设置Eof。因为它是你必须两次阅读最后一个条目。代替:

while (strm >> n >> m )
    if (isFact(n, m)