2016-06-12 66 views
-2

我正在写一个简单的链接列表,它工作正常,但我坚持重载ostream(嗯,我不确定我的意思是ostream还是instream!) :如何重载iostream运算符在整个流上执行一个函数

class List 
{ 
public: 
    void addToEnd(int data); 
    /* operator overloads */ 
    friend std::istream& operator >> (std::istream& is, int data); 
}; 

std::istream& operator>>(std::istream& is, int data) 
{ 
    for(int i = 0; i < is.gcount(); i++) 
    { 
     // how to call ist::addToEnd(data); 
    } 
} 

我想,使其以某种方式能够:

List list(); 
list << 2 << 3 << 4; 

让我用这种形式,而不是调用addToEnd(X)

+0

BTW,语句'List list();'声明了一个名为'list'的函数,它不接受任何参数并返回一个List类型的对象。你可能打算写'List list;','List list {};''或'List list = List();' –

+0

@DietmarKühl是的谢谢它只是一个错字:P –

回答

2

您展示的例子是:

list << 2 << 3 << 4; 

显然你需要重载operator <<,不operator >>。到<<的参数是Listint,所以你需要的功能是:

List& operator <<(List& list, int data) 
{ 
    list.addToEnd(data); 
    return list; 
} 

注意,这个功能并不需要成为朋友,因为它只使用的List公共方法。

没有涉及流感或ostream。

+0

谢谢。但我无法编译它。我添加了List&operator <<(List&list,int data);'标题,但是我得到一个抱怨:​​这个操作函数的参数太多了 –

+0

*你添加了哪个?这是一个独立的功能,所以应该在课堂外宣布。 (我也倾向于声明它是内联的,因为它太短了,编译器可以看到它只是对'addToEnd'的一系列调用。 –

+0

再次感谢,我首先将声明添加到List的头文件中'class。但是我只添加到源代码中,并且它的工作原理,所以这个超载与标题或类本身无关? –