C ++重载运算符<<通过使用静态帮助程序方法创建访问冲突错误

时间:2017-05-25 14:34:55

标签: c++ operator-overloading static-methods

我有一个名为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

Shows debugging error

创建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; }

如果这还不够,我很乐意添加更多信息。 如何解决此错误以及导致错误的原因是什么?

2 个答案:

答案 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::stringstd::string&而不是getCategoryByNumber