对于作业(和我自己),我需要能够打印单个链接的“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类中实现?提前致谢。
答案 0 :(得分:3)
答案 1 :(得分:1)
如果我理解了您的代码,则必须将<<
运算符重载到ListNode
和List
类。
//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;操作员一次! :)