【发布时间】:2017-06-20 21:27:24
【问题描述】:
我已经像这样重载了operator<<:
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();,显然是为了清空 stream 和 clear 错误状态。重复调用两个std::stringstream 函数让我觉得我做错了什么。
因此我主要需要以下帮助:
- 如何重用
std::stringstream变量 'ss' 而无需一次又一次地调用ss.str("");ss.clear();或 - 使用 googletest 对重载
operator<<实施测试的最佳替代方案。
【问题讨论】:
-
您不需要同时调用 str() 和 clear()。两个调用都做同样的事情。或者其他的就足够你想做的事情了。我不认为使用单独的 stringstream 变量会给您的代码带来任何可读性。使用 str("") 或 clear() (我个人的选择)使您的意图非常清晰,并且比从头开始创建新的字符串流更有效。
-
@MichaëlRoy Here 接受的答案说即使在调用 str("") 之后也需要调用 clear()。对我来说,只使用 str("") 工作正常。
-
@MichaëlRoy 也只使用
clear()是行不通的。
标签: c++ c++11 operator-overloading googletest stringstream