【发布时间】:2017-05-25 14:34:54
【问题描述】:
我有一个名为Bill 的课程。在类的属性中,有一个称为category 的类型为int。
打印账单时,应显示类别名称而不是编号。所以我写了这个静态辅助函数来将category整数转换为对应的字符串:
// Takes an integer representing the category and returns its corresponding name
static const std::string& getCategoryByNumber(int category)
{
switch (category)
{
case 1:
return "Food";
case 2:
return "Gift";
case 3:
return "Fuel";
case 4:
return "Electricity";
case 5:
return "Clothes";
case 6:
return "Holidays";
case 7:
return "Water";
case 8:
return "Fees";
default:
exit(1);
}
}
现在我尝试在 Bill 类定义之外重载 operator<<,如下所示:
std::ostream& operator<<(std::ostream& os, Bill& bill) {
int category = bill.getCategory();
const std::string& nameOfCategory = getCategoryByNumber(category);
std::cout << nameOfCategory.c_str();
return os;
}
创建bill类型的对象并运行这行代码时出现错误:
cout << billObject;
如果这些信息还不够,我很乐意添加更多信息。 我该如何解决这个错误,是什么原因造成的?
【问题讨论】:
-
std::string&->std::string -
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 edit 您的问题包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
-
@iehrlich 这样的东西可以用调试器检查。您从哪里假设 OP 是 一个没有经验的程序员?
-
离题:考虑用
std::string数组替换那个开关。你可以return categoryStrings[category];(如果你不能为浪费的 0 元素负担一个字符串的 RAM,也许可以category-1)和一个确保类别在范围内的测试。 -
"Food"不是string。它是恒定的字符数组。编译器将基于char数组自动且静默地创建string,因为string是必需的并且string具有char数组转换构造函数。不幸的是,这个制造的string是一个自动变量(也称为本地变量或临时变量),并且会超出范围并几乎立即被销毁,并且肯定会在您有机会使用它之前被销毁。最终结果是调用者获得了对死变量的引用。
标签: c++ operator-overloading static-methods