我有一个名为Bill
的班级。在该类的属性中,有一个名为category
的{{1}}类型。
打印帐单时,应显示类别的名称而不是数字。所以我编写了这个静态助手函数来将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);
}
}
类定义之外的operator<<
,如下所示:
Bill
创建bill类型的对象并运行以下代码行时会发生错误:
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;
}
如果这还不够,我很乐意添加更多信息。 如何解决此错误以及导致错误的原因是什么?
答案 0 :(得分:4)
编译器应该警告你&#34;返回对本地对象的引用&#34;或类似的(如果你打开所有警告,你应该总是这样)。您还应该避免调用exit()
,而是throw
例外,以便为应用程序提供恢复的机会
struct Bill
{
/* ... */
int GetCategory() const;
static string GetCategoryName(int category)
{
switch (category) {
default: throw std::runtime_error("Bill: category '"+
std::to_string(category)+"' unknown");
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";
}
}
};
inline
std::ostream& operator<<(std::ostream&os, Bill const&bill)
{
return os << Bill::GetCategoryName(bill.GetCategory());
}
答案 1 :(得分:2)
我对这里真正发生的事情的猜测是编译器在std::string
函数的上下文中从C字符串创建一个getCategoryByNumber
对象,返回对它的引用,并且它引用的对象被删除一旦函数返回,马上就会出现。
请考虑从const char*
返回std::string
或std::string&
而不是getCategoryByNumber
。