2014-11-18 3 views
-2

Я пишу небольшой код, чтобы узнать, что произойдет, если я использую операторы ввода строк для собственного класса.Оператор множественного ввода << в C++

#include <iostream> 
using namespace std; 


class MyClass 
{ 
    public: 
     int i; 
     MyClass & operator<< (const string & ); 

} ; 

MyClass& MyClass::operator<< (const string & ) 
{ 
    cout << this << endl ; 
} 

int main() 
{ 
    MyClass mc; 

    mc << "hello" << "world" ; 

} 

Он дает результат двух разных адресов памяти, что выходит за рамки моего воображения.

0x7fffdc69f6df 
0x6020a0 

я, хотя это должно быть как:

((mc << "hello") << "world"); 

Но на самом деле, это, кажется, "временный" MyClass между операциями. Это приводит к тому, что переменная-член (например, int i в классе) не будет согласована. Может ли кто-нибудь дать комментарии об этом, если я хочу, чтобы переменная-член (int i) могла получить доступ последовательно.

+2

Скомпилирует ли этот код? Функция оператора не возвращает значение. –

+2

Похоже, у вас есть некоторые серьезные заблуждения, что «mc <<« привет »« мир »,' на самом деле. Ваш вопрос не имеет смысла, все работает так, как ожидалось. –

+0

Привет, Матти! Код может быть скомпилирован. Я, возможно, не совсем понимаю концепцию перегрузки оператора. Именно по этой причине я пытаюсь написать небольшой код, чтобы понять. Код сбой при добавлении i ++ в реализацию MyClass & MyClass :: operator << (const string &) { i ++; cout << this << "" << i << endl; } –

ответ

1

вероятно Вы имели в виду, чтобы написать код, как следует

#include <iostream> 
using namespace std; 

class MyClass { 
    public: 
     int i; 
     MyClass & operator<< (const string & ); 
} ; 

MyClass& MyClass::operator<< (const string & str) { // Note the parameter symbol 
    cout << str << endl ; // Note usage of the parameter symbol "str", "this" is not 
          // what you actually want here, it just outputs the address 
          // of the class instance 
    return *this; // Return the instance reference properly to allow chaining of 
        // subsequent operator<<() calls 
} 

int main() { 
    MyClass mc; 

    mc << "hello" << "world" ; 
} 

Выход

hello 
world 

См LIVE DEMO


Давайте разберем это вниз:

mc << "hello" << "world"; 

фактически то же самое, как вызов

mc << "hello"; 
mc << "world"; 

Возвращаясь ссылку экземпляра будет включить функцию называют в цепи операторных вызовов применяются.


"Но на самом деле, это, кажется, "временный" MyClass между операциями."

Проблема возникает, что вы пропали без вести, чтобы вернуть текущий экземпляр, используя return *this; заявление. Таким образом, доступ к ожидаемому возвращаемому значению приводит к неопределенному поведению для второго вызова operator<<(). Компилятор должен был хотя бы выпустить предупреждение о отсутствующем заявлении return.

+0

Я получил его. Большое спасибо! –

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

  • Нет связанных вопросов^_^