0

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

编码:

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

那是错误的,我怎样才能在一个类中定义它们并获得与第一个示例相同的输出?

请帮我。

4

2 回答 2

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.

但是,我不确定您要达到的目标是什么,因为这样做似乎毫无意义。

于 2013-04-21T10:21:20.253 回答
1

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

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

于 2013-04-21T10:23:03.180 回答