【问题标题】:Making my own toString() method on c++ struct在 c++ 结构上制作我自己的 toString() 方法
【发布时间】:2018-11-08 15:32:59
【问题描述】:

我习惯于在类中自己的对象上重写 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++,所以任何建议都将不胜感激

【问题讨论】:

  • 您不能将int 添加到std::string
  • @user463035818 只是仍在努力让自己熟悉什么是有效的以及如何最好地做事
  • 字符串插值和连接在 C++ 中的工作方式与在 Java 中不同。要实现您在此处尝试的内容,您应该查找 stringstreams。
  • @whelanevan6 当然,我的评论中字里行间没有任何内容,但我建议您注意 java 和 c++ 是两种截然不同的语言。

标签: c++


【解决方案1】:

与 java 相比,C++ 不提供预定义的“toString”方法,只要请求对象的字符串表示,就会隐式调用该方法。所以你的toString-method 必须被显式调用。

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

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 << "\n Age: " << s.age << "\n 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;
}

【讨论】:

  • 这个。 C++ 不使用toString,C++ 使用operator&lt;&lt;
【解决方案2】:

您无法像在 Java String 中那样向 std::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);
    }
};

编辑:虽然这个答案解释了为什么你尝试的方法不起作用,但另一个答案的解决方案是首选方法。

【讨论】:

    【解决方案3】:

    您不能将 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();
    }
    

    【讨论】:

    • 您可以使用std::string,只需使用适当的重载即可。
    【解决方案4】:

    您不能只将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);
      }
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多