簡體   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