【问题标题】:Printing Objects via "<<" in a Linked-List in C++在 C++ 的链表中通过“<<”打印对象
【发布时间】:2011-09-27 11:27:15
【问题描述】:

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

每个 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;

}

很明显,我在 list.h 中遇到了“

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      如果我理解您的代码,您必须将 &lt;&lt; 运算符重载到 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

      【讨论】:

      • 所以它应该代表对我的模板对象的调用而不是return ostr &lt;&lt; "Foo";?那时我不太了解如何从我的股票对象中获取整数。如果我有一个对象“Stock”并且我想从中流出一个“int Num”和“String Name”。
      • @Staypuft 表示Stock 对象可以是ostr &lt;&lt; "(" &lt;&lt; s.symbol &lt;&lt; " " &lt;&lt; s.shares &lt;&lt; ")",结果应该是[ (GOOG 500) (VMW 90) (APL 350) ]
      【解决方案3】:

      我认为答案可能更简单。您只需覆盖 Stock 类的 &lt;&lt; 运算符即可。

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

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

      所以为了能够执行

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

      你基本上也需要能够做到

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

      这样,您的列表需要做的就是找出占用列表中“数据”的类,在本例中为 Stocks。

      所以

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

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

      这样你只需要重写一次

      【讨论】:

      • 哦,没注意到上面的日期。 ...我有点迟到了。哈哈,好吧,这可能没什么用,但希望它仍然有用!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2016-01-21
      • 2012-11-08
      • 2022-01-06
      • 2021-01-23
      相关资源
      最近更新 更多