2011-11-22 69 views
2

請幫助我在構造函數中初始化「out」?如何使用「char * filename」初始化構造函數中的「ostream&out」

class logger { 
     ostream &out; 

     public: 
     logger(char *str) : out(/*How do i construct an object using str*/) {}  

     template <typename T> void print(T &obj) { out << obj; } 
}; 

這個類將在全球範圍定義爲他人只是調用打印方法

更新: 我計劃有以下設置,其中類的用戶可以 1)創建一個新的ostream對象,如果他沒有一個。他可以創造,但他也必須管理它。所以不想提供該功能。 2)如果他已經有一個他可以像「cout/cerr」一樣傳遞。 3)如果他沒有通過「cerr」將被假定。

{

ostream &out; 

    public: 
    logger() : out(cerr) {}   
    logger(ostream &o) : out(o){} 
    logger(char *str) : out(/*How do i construct an object using str*/) {} 

}

+0

你究竟想要完成什麼?您是否嘗試創建連接到提供的文件名的輸出流?例如。記錄器l =新記錄器(「foo.txt」);會創建一個ostream並打開「foo.txt」進行編寫? –

+0

是......「l」將在全球範圍內提供...... – rakesh

回答

4

沒有必要爲你流聲明作爲參考,除非你希望能夠從另一個流進行初始化。事情是這樣的,也許:

class logger 
{ 
    ofstream file; 
    ostream &out; 

public: 
    logger(char *str) : file(str), out(file) {} 
    logger(ostream &os) : out(os) {} 

    // Other functions here, only using "out" 
}; 
+0

「您不需要將流聲明爲引用,除非您希望稍後從其他流中設置該流。」這沒有多大意義,因爲引用不能改變。 – PlasmaHH

+0

@PlasmaHH更新回答。 –

+2

只是一個nit,但我會顛倒聲明的順序。無論你在構造函數中寫什麼,'out'都將被構造_before_'file'。直到構建'file',將其轉換爲'ostream&'是正式的未定義行爲。 –

2

關於唯一的解決辦法這將工作將是:

logger::logger(char const* name) : out(*new std::ofstream(name)) {} 

但你不想這樣做;你也必須在 析構函數中刪除它。如果您在類中引用了std::ostream, ,您希望客戶端代碼向您傳遞對構造函數中現有ostream 對象—的一個對象,只要您的對象存在,它們就會保證將繼續存在一個對象 。如果你想傳入 一個文件名,並在構造函數中打開它,那麼你的對象 將包含一個std::ofstream,而不是一個引用。

+0

* * new:ofstream(name)'正確的語法? – Nawaz

+0

@Nawaz號我會編輯帖子來修復它。 –

+0

我試過了......沒有用... – rakesh