Печать объектов через «<<» в связанном списке в C ++ - PullRequest
0 голосов
/ 03 июля 2011

Для задания (и для себя) мне нужно иметь возможность распечатать односвязный список объектов "Stock".

Каждая акция как следующие частные данные членов: 1 int 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;
}

Simple 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, потому что он не может вывести содержимое моего класса акций. Моя конечная цель - перебрать каждый элемент в связанном списке и напечатать символ строки и int. Я предполагаю, что мне нужно будет использовать какую-то перегрузку операторов? Или я далеко от базы? Если я это сделаю, должно ли это быть реализовано в моем классе акций? Заранее спасибо. </p>

Ответы [ 3 ]

3 голосов
/ 03 июля 2011

Вам потребуется перегрузить оператор << .

1 голос
/ 14 июля 2011

Я думаю, что ответ может быть более простым.Вам нужно всего лишь переопределить оператор << класса Stock.

Поскольку функция print() вашего Списка настроена на указание на каждый узел, а затем cout << currentPtr->data, единственное, что нужно иметьПерегрузка оператора - это каждый отдельный класс «data».

В данном случае это ваш класс Stock.

Таким образом, чтобы можно было выполнить

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

в основном вам также нужно уметь

    int main(){

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

Таким образом, все, что нужно вашему списку, - это указывать класс, занимающий «данные» в вашем списке, в данном случае Stocks.

SO

ваш класс Stocks должен иметь перегрузку оператора, подобную той, что была упомянута выше.Это может выглядеть примерно так:

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

Таким образом, вам нужно только один раз переопределить оператор <<!:) </p>

1 голос
/ 03 июля 2011

Если бы я понял ваш код, вам придется перегрузить оператор << для классов 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 << "]";
}

Выведет [ Foo Foo Foo ] для списка из 3 элементов.

Кстати, вы должны пометить эти функции как friend, если вам нужен доступ к закрытым членам.

...