2009-10-31 80 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)