在C ++结构上制作自己的toString()方法

时间:2018-11-08 15:32:59

标签: c++

我习惯在类中自己的对象上使用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 ++,因此任何建议都将不胜感激

4 个答案:

答案 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)

您不能仅将intdouble添加到std::string。首先使用std::to_string进行转换。这应该可以正常工作:

std::string toString() {
    return "Name: " + name + "\n Age: " + std::to_string(age) + "\n Final Grade: " + std::to_string(finalGrade);
  }