2009-10-10 7 views
0

Im пытается вызвать функцию:Стрим вставка перегружать C++

friend ostream& operator<<(ostream& out, stack::myItem& theItem); 

, что является общественным к моему объекту стека:

class stack 
{ 
public: 
    stack(int capacity); 
    ~stack(void); 
    void method1(); 
    ... 

private: 

    struct myItem 
    { 
    int    item; 
}; 

    ... 
public: 
    friend ostream& operator<<(ostream& out, stack& s); 
    friend ostream& operator<<(ostream& out, stack::myItem& theItem); 
}; 

То, что я знаю, что эта функция ниже:

ostream& operator<<(ostream& out, stack& s) 
{ 
if (s.count == 0) // then no elements have been counted. 
    out << "\nstack: empty\n\n"; 
else 
     { 
     out << "\nstack: "; 
     for (int i = 0; i < s.count; i++) 
     { 
    if (i < s.count-1) 
        out << s.myItem[i].item << ", "; 
       else out << s.myItem[i].item; 
     } 
     out << "\n\n"; 
} 
    return out; 
} 

с данным оператором: стек s = стек (7); функция, указанная выше, называется всякий раз, когда я использую: cout < < s;

Как я могу назвать функцию ниже?

ostream& operator<<(ostream& out, stack::myItem& theItem) 

out << theItem.item; 
return out; 
} 

Потому что, когда я пытаюсь сделать следующее:

ostream& operator<<(ostream& out, stack& s) 
{ 
if (s.count == 0) // then no elements have been counted. 
     out << "\nstack: empty\n\n"; 
else 
     { 
     out << s; 
     } 
     return out; 
} 

Это приводит к аварии, так как заявление из < < s; будет бесконечным .. При отладке коды никогда не будет идти к следующему оператору ...

ответ

1

Если вы хотите назвать это на myItem структуру, а затем:

for (int i = 0; i < s.count; i++) 
{ 
    if (i < s.count-1) 
     out << s.myItem[i] << ", "; 
    else out << s.myItem[i]; 
} 

назвал бы его на каждых структуры в стеке.

В бесконечно рекурсивном режиме вы просто вызываете его снова в стеке, а в первой версии вы вызываете его в «item» int внутри структуры myItem.

(и как это дело вкуса, я предпочитаю держать граничное условие петли из для операторов, как это :)

for (int i(0), end(s.count-1); i < end; ++i) 
{ 
    out << s.myItem[i] << ", "; 
} 
out << s.myItem[s.count]; 
+0

вы могли бы более подробно остановиться на для прекращения Conditon? – user40120

+0

Если вы имеете в виду примечание в конце, код без условного в цикле более четко указывает на намерение; вы печатаете элементы 0- [end-1] с запятой, затем последний элемент с новой строкой –

Смежные вопросы