2017-06-20 60 views
0

我重載operator<<這樣的:如何避免在重用std :: stringstream變量時使用std :: stringstream.str()和std :: stringstream.clear()?

std::ostream& operator<<(std::ostream& os, SomeClass C){ 
//SomeClass is the class to be represented with operator overloading 
os << "{ "; 
os << C.getPropertyA() << " "; 
os << C.getPropertyB() << " }"; 
//getPropertyA(), getPropertyB():functions of 'SomeClass' that return std::string 
return os; 
} 

現在我使用googletest測試operator<<超載這樣的:

SomeClass C1; 
SomeClass C2; 
. 
. 
std::stringstream ss; 
std::string str; 

//First test 
ss << C1; 
std::getline(ss, str); 
EXPECT_EQ("<some expected value>", str); // googletest test 

//Second test 
ss.str("");ss.clear(); //Mandatory if 'ss' need to be reused 
ss << C2; 
std::getline(ss, str); 
EXPECT_EQ("<some expected value>", str); // googletest test 
. 
. 
//Some more use 'ss' follows 

現在的問題是,每次我添加一個新的測試我需要在測試之前增加ss.str("");ss.clear();,顯然空明確錯誤狀態。這個重複調用兩個std::stringstream函數讓我覺得我做錯了什麼。

因此,我主要是需要幫助:

  • 如何重用std::stringstream變量「SS」無連連OR
  • 最好的選擇調用ss.str("");ss.clear();使用googletest實現重載operator<<測試。
+0

您不需要同時調用str()和clear()。這兩個調用都做同樣的事情。或者另一個就足夠你想要做的事情。我不認爲使用單獨的stringstream變量會爲您的代碼帶來任何可讀性。使用str(「」)或clear()(我的個人選擇)使yuour的意圖非常清晰,並且從零開始創建新的stringstream會更有效率。 –

+0

@MichaëlRoy[Here](https://stackoverflow.com/questions/12112259/how-to-reuse-stringstream)接受的答案表示,即使在調用str(「」)之後仍然需要調用clear()。對我來說,只使用str(「」)工作得很好。 – MasterJEET

+0

@MichaëlRoy同樣只使用'clear()'不起作用。 – MasterJEET

回答

5

您不需要從字符串流getline或者您可以直接訪問底層存儲。更簡單的方法是爲每個測試創建新的stringstream

//First test 
{ 
    SomeClass C1; 
    . 
    std::stringstream ss; 
    ss << C1; 
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test 
} 

//Second test 
{ 
    SomeClass C2; 
    . 
    std::stringstream ss; 
    ss << C2; 
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test 
} 
+0

感謝您指出多餘使用'getline()'。我現在堅持@MichaëlRoy的建議。 – MasterJEET

相關問題