2009-10-31 144 views
1

我在我的头文件下面的代码:问题传递的IStream参数类构造函数

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

问题是istream是一个“接口”。它具有纯粹的虚拟功能,所以没有必要拥有它的副本。你可能做的是一个参考保持到经过的流:

std::istream& strm_; 

strm_可能是ifstreamistringstreamistream派生的任何输入流。

2

由于基类ios的副本ctor是私有的,因此无法复制构建流。尝试使流成员成为一个引用,而不是一个独立的对象。

2

您正在尝试存储流的副本。这是行不通的,因为流不可复制。最好你可以做的是存储一个参考或指针。

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

其他问题:

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

     if (isFact(n,m)) 

EOF当读取数据的尝试失败,因为这个设置。因为它是你必须读两次最后一个条目。相反:

while (strm >> n >> m) 
    if (isFact(n, m) 
相关问题