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


Making my own toString() method on c++ struct

我习惯在类中自己的对象上使用Java toString()方法,但是我不确定以下代码在哪里出问题:

1
2
3
4
5
6
7
8
9
10
11
    struct Student {
    std::string name;
    int age;
    double finalGrade;

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

我才刚刚开始学习c ++,所以任何建议都将不胜感激


您无法像向Java String一样向std::string添加所需的任何内容。值得注意的是,大多数对象不应具有toString成员函数。但是,标准库提供了std::to_string,它允许您将数值转换为std::string。例如,您可以用std::to_string包装数字值以修复函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>

struct Student {
    std::string name;
    int age;
    double finalGrade;

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

编辑:尽管此答案解释了为什么您尝试的方法不起作用,但另一个答案的解决方案是首选方法。


与Java相反,C ++不提供预定义的" toString"方法,该方法在每次请求对象的字符串表示形式时都会隐式调用。因此,然后必须显式调用toString方法。

但是,在C ++中,可以通过覆盖流的operator <<来获得类似的东西。因此,您可以直接将对象内容"发送"到流中(无需将所有内容存储在中间字符串对象中)。而且,您也可以使用相同的代码来填充要由toString方法返回的字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct Student {
    std::string name;
    int age;
    double finalGrade;

    std::string toString() const;
};

ostream& operator << (ostream &os, const Student &s) {
    return (os <<"Name:" << s.name <<"
 Age:"
<< s.age <<"
 Final Grade:"
<< s.finalGrade  << std::endl);
}

std::string Student::toString() const {
    stringstream ss;
    ss << (*this);
    return ss.str();
}

int main() {

    Student stud {"john baker", 25, 1.2 };
    std::cout <<"stud directly:" << stud << endl;
    std::string studStr = stud.toString();
    std::cout <<"stud toString:" << studStr << endl;
}


您不能将int添加到std :: string中,因为std::string operator+没有重载为int。

最好的解决方案是使用字符串流:

1
2
3
4
5
6
7
8
9
#include <sstream>

std::string toString() {
    std::ostringstream strout;
    strout<<"Name:" << name <<"
 Age:"
<< age <<"
 Final Grade:"
<< finalGrade;
    return strout.str();
}


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

1
2
3
4
5
std::string toString() {
    return"Name:" + name +"
 Age:"
+ std::to_string(age) +"
 Final Grade:"
+ std::to_string(finalGrade);
  }