2011-08-20 35 views
1

我有,我想給一個輸出流作爲成員,以機智類:如何更改C++輸出流以引用cout?

class GameBase { 
protected: 
    ofstream m_OutputWriter; 
... 
} 

有一個在這個類需要一個字符串參數,並打開m_OutputWriter指向該文件的方法,所以可以使用標準的< <運算符將數據輸出到該文件;

但是,我想讓默認流指向cout,以便如果未指定輸出路徑,輸出將轉到控制檯輸出而不是文件,並且它將完全透明呼叫類,誰將使用

m_OutputWriter << data << endl; 

將數據輸出到預定目的地。然而,我在這裏嘗試了一些其他的例子,其中沒有一個完全符合我想要做的。

我在這裏錯過了什麼?

+0

可能重複http://stackoverflow.com/questions/366955/obtain-a-stdostream- stdcout-or-stdofstreamfile) – GWW

回答

1

除了擁有std::ofstream作爲成員之外,我會使用返回std::ostream&的函數。

例如:

class GameBase { 
    std::ofstream m_OutputWriter; 
protected: 
    std::ostream& getOutputWriter() { 
     if (m_OutputWriter) 
      return m_OutputWriter; 
     else 
      return std::cout; 
    } 
    ... 
} 

一個全功能例如:

#include <iostream> 
#include <ostream> 

std::ostream& get() { 
    return std::cout; 
} 

int main() { 
    get() << "Hello world!\n"; 
} 
+0

我該如何使用「<<」運算符指向輸出流的指針? GetOutputWriter()<<「Hello,World \ n」;當我嘗試它時不會編譯。 – Charles

+0

@Charles - 無論如何,這是正確的語法;請參閱我附加的示例。你必須提供mre信息,說明它爲什麼不能編譯(也許因爲它不是'const'?你幾乎不可能避免這種情況,除非你將'm_OutputWriter'標記爲'mutable')。 –

+0

好吧,我發現了這個問題,我正在嘗試一些愚蠢的行爲,因爲m_OutputWriter有一個非空值。我將測試更改爲「if(m_OutputWriter.is_open())」,現在它工作得很好。空的圓括號讓我瘋狂,因爲我這麼喜歡我在C#中的屬性,但我猜它沒有它的工作。謝謝你的幫助! – Charles

2

爲什麼流需要成爲會員?

struct GameBase { 
    void out(std::ostream& out = std::cout); 
    // ... 
}; 
的[獲取一個std :: ostream的無論是從標準:: COUT或std :: ofstream的(文件)](