2009-10-07 3 views
2

Im действительно не знает, как вызвать функцию:поток вставка Оператора перегрузки

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); 
}; 

ответ

3

Это не отличается от использования потока оператора < < для любых других тип (он вызван оператором перегрузкой по причине).

Однако вывод не должен изменять объект, поэтому вы действительно должны передавать его по ссылке const (иначе вызовы с временными данными не будут скомпилированы).

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

Звоните ему откуда? Поскольку он кодируется, класс знает только о частной структуре. Никакой код, внешний для класса, не может использовать этот метод, поскольку он не может создать экземпляр структуры. Пометить это как друга не делает вам много хорошего.

3

Этот оператор является классическим двоичным оператором.

// Say I have an operator declared like this: 
return_type [email protected](left_type lhs, right_type rhs); 

// Then the invocation is done this way: 
left_type L; 
right_type R; 
return_type result = L @ R; 

В случае оператора потоковой передачи, это немного особенный, поскольку левый аргумент руки и типа возвращаемого на самом деле имеют один и тот же тип (и действительно, будут ссылаться на тот же объект, хотя и в разное время) , Это сделано для обеспечения цепочки.

// Chaining 
std::cout << "<Output> " << 1 << std::endl; 

// Which can be analyzed like such 
operator<<(
    operator<<(
    operator<<(
     std::cout , 
     "<Output> " 
    ), 
    1 
), 
    std::endl 
); 

Как вы можете видеть, синтаксис просто позволяет использовать удобный вызов. Можно отметить, что порядок очень четко определен, это строго оценка слева направо.

Так с объектом, он стал бы:

stack s; 
std::cout << s << std::endl; 

Так же, как это!