2011-05-29 114 views
0

我一直在做这个学校任务。该任务告诉我们制作一个对象,该对象的输出操作符(< <)被重载。 这里是我的代码:C++输出运算符过载

#include <ostream> 
using namespace std; 

template <class T> 
class CustomObject { 

     string print() { 
      string text = ""; 
      for (int i = 0; i < num_items(); i++) { 
       text += queue[i]; 
       text += " | \n"; 
      } 
      return text; 
     } 

     friend std::ostream& operator <<(std::ostream &output, CustomObject &q) { 
      output << "" << q.print(); 
      return output; 
     } 
} 

所以我实例化这个对象是这样的:

CustomObject<int> co(); 

并调用它的输出方法:

std::cout << co(); 

这将不可避免地调用print方法,并返回将字符串转换为默认输出流。

但是,我的控制台/调试器中没有可见的输出。

我在这里错过了什么?

PS这是而不是完整的类,它是通用的,因为其他几种方法和功能不需要在这里显示。

PPS num_items()和队列变量是其余的部分,这个类是一个PriorityQueue对象。所以,queue是指定类型的数组(因此是泛型声明),而num_items()只是返回数组的数量。

回答

5
CustomObject<int> co(); 

这是一个函数声明。省略括号。

std::cout << co(); 

你为什么底肥operator()co?再次,省略括号。这应该工作:

CustomObject<int> co; 
std::cout << co; 

唉,从打印方法建立并返回一个字符串很难用惯用的C++。这里是我会做什么:

template <typename T> 
class CustomObject 
{ 
    // ... 

public: 

    void print(std::ostream& os) const 
    { 
     for (int i = 0; i != num_items(); ++i) 
     { 
      os << queue[i] << " | \n"; 
     } 
    } 
}; 

std::ostream& operator<<(std::ostream& os, const CustomObject& object) 
{ 
    object.print(os); 
    return os; 
} 
+0

我认为他将函数调用操作,因为'co'是一个函数,编译器会抱怨,直到他添加了parens。当然,连接应该失败,因为'co'没有定义,只是一个声明。编译应该失败,因为正如@Bo指出的那样,'operator <<'带了一个非const引用,它不能绑定一个临时对象。那么究竟是什么实际的代码被测试是任何人的猜测。 – 2011-05-29 15:54:43

+0

用于我的自定义类的构造方法的括号。或者,这不是调用我的对象的构造方法的正确方法? – Craimasjien 2011-05-29 17:24:25

+0

很难确定问题出在工作代码上,它工作正常。 你能指出问题是什么吗?我仍然在创建我的对象时使用了括号,从我的调试器中可以看到它的构造函数。是否有一种“有效”的方式来做这样的事情,比如目标c? 而且,使用const标志在这里有什么实际用途,我知道它做了什么等等,但我认为我的代码逻辑将省去使用'const'的必要性:D 虽然感谢,现在魅力! – Craimasjien 2011-05-29 17:32:23

1

如果您希望能够打印的临时对象好了,你应该做的参数const引用:

CustomObject const& q)