我习惯在类中自己的对象上使用Java toString()方法,但是我不确定以下代码在哪里出问题:
struct Student {
std::string name;
int age;
double finalGrade;
std::string toString() {
return "Name: " + name + "\n Age: " + age + "\n Final Grade: " + finalGrade;
}
};
我才刚刚开始学习c ++,因此任何建议都将不胜感激
答案 0 :(得分:7)
您无法像向Java std::string
一样向String
添加任何所需内容。值得注意的是,大多数对象不应具有toString
成员函数。但是,标准库提供了std::to_string
,可让您将数值转换为std::string
。例如,您可以用std::to_string
包装数字值以修复函数:
#include <string>
struct Student {
std::string name;
int age;
double finalGrade;
std::string toString() {
return "Name: " +
name +
"\n Age: " +
std::to_string(age) +
"\n Final Grade: " +
std::to_string(finalGrade);
}
};
编辑:尽管此答案说明了您尝试的方法不起作用的原因,但另一个答案的解决方案是首选方法。
答案 1 :(得分:5)
您不能将int添加到std :: string中,因为std::string
operator+
没有重载为int。
最好的解决方案是使用字符串流:
#include <sstream>
std::string toString() {
std::ostringstream strout;
strout<< "Name: " << name << "\n Age: " << age << "\n Final Grade: " << finalGrade;
return strout.str();
}
答案 2 :(得分:5)
与Java相比,C ++不提供预定义的“ toString”方法,该方法在每次请求对象的字符串表示形式时都会隐式调用。因此,您的const arr = [
[[10, 10], [15], [1, 1]],
[[2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [4], [9, 11]],
[[3, 5, 1], [1, 5, 3], [1]],
[[90]],
];
const flatten = (arr) => {
const recur = (result, item) =>
!Array.isArray(item)
? result.concat(item)
: result.concat(item.reduce(recur, []));
return arr.reduce(recur, []);
};
console.log(
flatten(arr).reduce((result, item) => result + item, 0),
);
方法将必须随后显式调用。
但是,在C ++中,可以通过覆盖流的toString
来获得类似的东西。因此,您可以直接将对象内容“发送”到流中(无需将所有内容存储在中间字符串对象中)。而且,您也可以使用相同的代码来填充将由operator <<
方法返回的字符串:
toString
答案 3 :(得分:2)
您不能仅将int
或double
添加到std::string
。首先使用std::to_string进行转换。这应该可以正常工作:
std::string toString() {
return "Name: " + name + "\n Age: " + std::to_string(age) + "\n Final Grade: " + std::to_string(finalGrade);
}