繁体   English   中英

将istream参数传递给类构造函数时出现问题

[英]problem passing in istream argument to a class constructor

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

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 &)

我想我确实缺少一些明显的东西。 因此,任何帮助将不胜感激。

问题在于istream是一个“接口”。 它具有纯虚函数,因此没有副本是没有意义的。 您可能要做的是保留对传递的流的引用:

std::istream& strm_;

strm_可以是ifstreamistringstream或从istream派生的任何输入流。

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

您正在尝试存储流的副本。 这是行不通的,因为流不可复制。 最好的办法是存储引用或指针。

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

其他问题:

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

        if (isFact(n,m))

因此,当尝试读取数据失败时将设置Eof。 因为它是您必读两次的最后一项。 代替:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM