2014-04-14 50 views
0

我需要一個接口來將短消息寫入日誌文件,消息通常包含多個部分,如標識符和值。從簡單的靜態成員函數使用std :: stringstream

爲了做到這一點,我創建了一個類來處理很多次要的東西,比如用時間戳等創建文件名,儘管我不想使用可變參數列表(int nargs, ...),所以我想我的最好的選擇是將std::stringstream代替寫入函數。

我希望能夠將這些調用作爲單行程序寫入,而不必每次都需要創建std::stringstream,因此我創建了一個靜態成員函數來返回可用於寫入的stringstream對象功能,雖然由於某種原因它不起作用。

MyClass.h

class MyClass { 
public: 

    static std::stringstream& stream(); 
    void write(std::ostream& datastream); 

private: 

    static std::stringstream* _stringstream; 

}; 

MyClass.cpp

std::stringstream* MyClass::_stringstream = new std::stringstream(); 

std::stringstream& MyClass::stream() { 
    MyClass::_stringstream->str(std::string()); 
    return *MyClass::_stringstream; 
} 

void MyClass::write(std::string data) { 
    this->_fhandle << data << std::endl; 
} 

void MyClass::write(std::ostream& datastream) { 
    std::string data = dynamic_cast<std::ostringstream&>(datastream).str(); 
    this->write(data); 
} 

的main.cpp

MyClass* info = new MyClass(); 
info->write("Hello, world"); 
info->write(MyClass::stream() << "Lorem" << ", " << "ipsum"); 
info->write(MyClass::stream() << "dolor sit" << " amet"); 

代碼編譯,但是當在執行應用程序,我得到一個std::bad_cast例外...

+0

這有什麼錯創建每次你登錄時''stringstream'?您每秒記錄多少次? –

回答

2

那是因爲你正在創建std::stringstream,這 不從std::ostringstream派生。只需創建一個 std::ostringstream,並且bad_cast應該消失。

話雖如此,多次使用std::ostringstream這樣的 通常不是一個好主意; iostream類是 充滿狀態,這將不會在每次使用之間重置。每次創建新實例的效果都是 。 (對於這樣的事情經典 解決方案是創建一個可複製的包裝 類,它轉發到這個 的std::ostream。實例由info->write()返回,所以你可以寫info->write() << "Hello, world" ...。)

相關問題