通过“<<”打印对象在C ++中的Linked-List中

时间:2011-07-03 01:03:08

标签: c++ templates operator-overloading linked-list

对于作业(和我自己),我需要能够打印单个链接的“Stock”对象列表。

每个股票作为以下私人数据成员: 1个 1个字符串

这是我必须使用/开发的链表类中的打印功能。我不允许使用STL :: list()。

//list.h
template<class NODETYPE>
void List< NODETYPE>::print() const
{
if(isEmpty() ){
    cout<<"the list is empty\n\n";
    return;
}

ListNode< NODETYPE> *currentPtr=firstPtr;

cout<<"The list is: ";

while (currentPtr!=0){
    //cout << currentPtr->data << ' ';
    currentPtr = currentPtr->nextPtr;
}

cout<< "\n\n";
}

现在列表中的节点,listnode.h:

//ListNode.h
//ListNode Template Definition
#ifndef LISTNODE_H
#define LISTNODE_H

template< class NODETYPE > class List;

template < class NODETYPE>
class ListNode {
friend class List < NODETYPE>;

public:
    ListNode (const NODETYPE &); //constructor
    NODETYPE getData() const;

private:
   NODETYPE data;
   ListNode< NODETYPE> *nextPtr;

};

 template<class NODETYPE>
 ListNode< NODETYPE >::ListNode(const NODETYPE &info): data (info), nextPtr(0)
 {

 }
 template<class NODETYPE>
 NODETYPE ListNode<NODETYPE>::getData() const{
    return data;
 }

#endif

现在我的股票类别:

class Stock{
public:
    Stock(); //default constructor
    Stock(string, int); //overloaded constructor
    ~Stock(); //deconstructor
    void setSymbol(string); //sets stock symbol
    void setShares(int);
    string getSymbol();
    int getShares();
private:
    string symbol;
    int shares;
};
Stock::Stock(){
symbol=" ";
shares=0;
}
Stock::Stock(string s, int num){
    cout<<"Creating Stock with supplied Values! \n\n"<<endl;
    symbol=s;
    shares=num;
    price=p;
}

用于测试的简单int main():

int main(){

List < Stock > portfolio_list;

Stock Google("GOOG", 500);
Stock VMware("VMW", 90);
Stock Apple("APL", 350);

portfolio_list.insertAtFront(Google);
portfolio_list.insertAtFront(VMware);
portfolio_list.insertAtFront(Apple);

portfolio_list.print();

return 0;

}

很明显,我得到“&lt;&lt;”的运算符错误在list.h中,因为它无法输出我的库存类的内容。我的最终目标是遍历链表中的每个元素并打印字符串符号和int。我假设我需要使用某种运算符重载?还是我离开基地?如果我这样做,是否应该在我的Stock类中实现?提前致谢。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

如果我理解了您的代码,则必须将<<运算符重载到ListNodeList类。

//Representation of ListNode
template <class T>
ostream& operator << (ostream& ostr, ListNode<T>& ls) {
    return ostr << "Foo"; //replace "Foo" with the proper representation
}

//Representation of List
template <class T>
ostream& operator << (ostream& ostr, List<T>& ls) {
    ostr << "[ ";
    for(ListNode<T> *i = ls.firstPtr; i != NULL; i = i->nextPtr)
        ostr << *i << " ";
    return ostr << "]";
}

将为{3}元素列表打印[ Foo Foo Foo ]

顺便说一句,如果您需要访问私人成员,则应将这些功能标记为friend

答案 2 :(得分:1)

我认为答案可能更简单。您只需要覆盖Stock类的<<运算符。

由于List的print()函数设置为指向每个节点,然后cout << currentPtr->data,因此唯一需要运算符重载的是每个单独的“数据”类。

在这种情况下,这是您的Stock类。

所以为了能够执行

    cout << currentPtr->data << ' ';

你基本上也需要能够做到

    int main(){

        Stock Google("GOOG", 500);
        cout << Google << ' ';
    }

这样,你的所有列表需要做的就是在列表中占用“数据”的类,在这种情况下是股票。

SO

你的Stocks类需要有一个类似于上面提到的运算符重载。它可能看起来像这样:

//Representation of Stock
ostream& operator << (ostream& ostr, Stock &st) {
    return ostr << "stuff"; // "stuff" is your data (st.symbol and whatever else)
}

这样你只需要覆盖&lt;&lt;操作员一次! :)