2013-04-21 78 views
0

我的代碼存在一些問題,因爲它輸出兩個不同的結果。Ostringstream不同的結果

的代碼:

void output(int x){ 


for(int i = 0; i <=x; i++){ 


std::ostringstream ss; 

std::string result; 

ss << std::setw(5) << std::left << "Hi" << ' ' << "There " << i << "\n"; 

std::vector<char> s(result.c_str(), result.c_str() + result.size() + 1u); 


result +=ss.str(); 


std::cout << result; 

} 



} 

輸出:

你好0

你好1

你好2

你好3

這是正確的調用它像:輸出(3);,但是當我試圖在一個類中定義它們並使用它時

函數裏面的東西開始變得很怪異。我使用的現在的代碼是:

class myclass{ 


public: 

std::ostringstream ss; 

std::string result; 


}v; 



void output(int x){ 


for(int i = 0; i <=x; i++){ 




v.ss << std::setw(5) << std::left << "Hi" << ' ' << "There " << i << "\n"; 

std::vector<char> s(v.result.c_str(), v.result.c_str() + v.result.size() + 1u); 


v.result +=v.ss.str(); 


std::cout << v.result; 

} 



} 

它輸出:

你好0

你好0

你好0

你好1

你好有0

你好0

你好1

你好0

你好1

你好2

你好0

你好0

你好1

你好0

你好1

你好2

你好0

你好1

你好2

你好3

這是錯誤的,我怎麼能仍然在一個類中定義他們,並得到像第一個例子一樣的輸出?

請幫幫我。

回答

2

在第一個示例中,您的字符串流是循環的本地流。這意味着它在每次迭代時都會被破壞並重新創建。

但是在第二個例子中,這不會發生,因爲該流屬於類對象v。它只要生活v。這意味着它會在每次迭代時保存所有內容。

要獲得相同的結果執行這一

v.result +=v.ss.str(); 
std::cout << v.result; 
v.ss.str("");  // This will clear the string stream of v. 
v.result = "";  // This will clear the string of v. 

但是我不知道你想實現的,因爲它看起來有點毫無意義的做到這一點的。

+0

那仍​​然不回答我的問題,如何使用類和獲得相同的輸出像第一個例子 – 2013-04-21 10:22:37

+0

@annaSjolvikaz請參閱編輯。 – stardust 2013-04-21 10:25:20

+0

它說:函數不帶1個參數,並指向:v.result.c_str(「」); – 2013-04-21 10:25:53

1

函數內部每次都會得到一個新的空字符串和字符串流。當存儲在類中時,它們被重用並累積輸出。

沒有什麼能阻止你在成員函數中使用局部變量,並獲得與自由函數中相同的功能。