Ostringstream结果不同

时间:2013-04-21 10:18:13

标签: c++

我的代码遇到了一些问题,因为它输出了两个不同的结果。

代码:

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

这是正确的,如: output(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 个答案:

答案 0 :(得分: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.

但是我不确定你想要实现的目标,因为这样做看起来有点无意义。

答案 1 :(得分:1)

在函数内部,每次都会得到一个新的空字符串和stringstream。当存储在类中时,它们被重用并累积输出。

没有什么可以阻止你在成员函数中使用局部变量,并获得与自由函数中相同的功能。