2014-02-14 84 views
4

我有一個類,這是有點像這樣:C++流引用作爲類成員

#include <iostream> 

class A { 
public: 
    A (std::istream& is): _is(is) {} 

    void setInputSource (std::istream& is) { 
     _is = is; 
    } 

    A& operator>> (int& x) { 
     _is >> x; 
     return *this; 
    } 

private: 
    std::istream& _is; 
}; 

而且我希望_is成員只是作爲一個參考作用。我的意思是,它必須「指向」外部std::istream,我不希望setInputSource()方法複製作爲參數傳遞的流。問題是程序不會編譯,因爲我提到的方法是試圖訪問類std::basic_istream<char>operator=

我的目標是讓類像預期的那樣在這樣的程序:

int main() { 
    int a, b; 

    std::ifstream ifs("myfile.txt"); 
    A myA(std::cin); 

    myA >> a; 
    myA.setInputSource(ifs); 
    myA >> b; 

    return 0; 
} 

我想用指針來代替,但我更喜歡,因爲我喜歡的事實,他們被擔保人您使用引用他們不會有無效的價值,在我看來這是一個更優雅的方法。

回答

4

綁定後,您不能將引用綁定到其他對象。這是使用指針和使用引用之間的根本區別之一。鑑於此,使用指針會更合適。

我喜歡,因爲我喜歡他們被保證人你其實使用的參考,他們將不具有無效值

這是不正確的。如果引用綁定的對象被銷燬,那麼它引用一個無效的對象,就像指針一樣。

1

你不能這樣做。定義引用的唯一方法是在構造函數中。

它實際上非常方便,因爲它可以保證對象在它所依賴的引用之前超出範圍。

例如,使用您的設計,可能會將myA置於無效狀態。

int main() { 
    int a, b; 

    A myA(std::cin); 
    myA >> a; 

    { 
     std::ifstream ifs("myfile.txt"); 
     myA.setInputSource(ifs); 
    } 

    myA >> b; 

    return 0; 
} 

你當然還可以用指針拍攝自己的腳。

1

聽起來像是你只是想改變緩衝:

class A 
{ 
public: 
    A (std::istream& is) 
     : m_is(is.rdbuf()) 
    { } 

    void setInputSource(std::istream& is) { 
     m_is.rdbuf(is.rdbuf()); 
    } 

    // ... 

private: 
    std::istream m_is; 
}; 
+0

但問題是,我將向下轉換'的std ::動態ifstream'檢查一些在內部的其他方法類的具體方法我的班級,只是緩衝區共享不會讓我做那些comprobations(我認爲)。 – skatrak