2013-06-12 2 views
1

Многие из вас могут знать следующее C++:Перегрузки << оператор - несколько параметров

cout << 1 << 2 << 3 << 4; // would produce 1234 

Я пытаюсь воссоздать то же самое - но вместо того, чтобы инкапсулировать в класс и приращение значений в целочисленные переменные.

я получаю ошибку:

ошибку: 'Int оператор < < (Const INT &, Const INT &)' должен иметь аргумент класса или перечисления типа |

class Test 
{ 
private: 
    int data; 

public: 
    Test() { data = 0; } 
    void print() { cout << data; } 

    friend int operator<<(const int &x, const int &y) 
    { 
     data += x; 
     data += y; 
    } 
}; 

int main() 
{ 
    Test a; 
    a << 50 << 20; 
    a.print(); //if I had only 1 parameter - it worked and printed out only 50 
    return 0; 
} 
+0

Ваш оператор для тестового класса не только для целых чисел. он должен быть членом не другом. – aggsol

+2

Возьмите один параметр. Верните ссылку на * this; –

ответ

9

cout << 1 << 2 << 3 << 4;

Таким образом, это работает как ряд вызовов, с двумя аргументами например

(((cout << 1) << 2) << 3) << 4; 

что примерно эквивалентно следующему:

cout << 1; 
cout << 2; 
cout << 3; 
cout << 4; 

Таким образом, вы не пишете operator<< принимать несколько параметров, она всегда принимает два операнда, левый операнд и правый операнд. Левый операнд в приведенном выше примере равен cout, то есть ostream, а правый операнд - int. Оператор возвращает левый операнд, позволяя ему снова использоваться в следующей операции и т. Д. Для всего количества операций <<, когда вы соединяетесь вместе.

Так cout << 1 возвращает cout снова, таким образом, что (cout << 1) << 2 вызывает оператор, чтобы написать 1 в поток и возвращает поток, затем вызывает оператор снова на возвращаемом значении для записи 2 в поток, а затем возвращает поток снова.

Это просто нонсенс:

friend int operator<<(const int &x, const int &y) 
{ 
    data += x; 
    data += y; 
} 

Где data должен взялось? Функция друга не является членом класса, поэтому нет указателя this, поэтому нет this->data, также вы утверждаете, что возвращаете int, но ничего не возвращаете, и этот класс полностью не связан с Test. То, что вы написали, - это operator<< для двух целых чисел, например для 1 << 2, но этот оператор уже существует, это оператор с битрейтом, и вы не можете перегружать его для встроенных типов, например int.

Вы хотите:

class Test 
{ 
private: 
    int data; 

public: 
    Test() { data = 0; } 
    void print() { cout << data; } 

    Test& operator<<(int y) 
    { 
     data += x; 
     return *this; 
    } 
}; 

Или в другом:

class Test 
{ 
private: 
    int data; 

public: 
    Test() { data = 0; } 
    void print() { cout << data; } 

    friend Test& operator<<(Test& t, int y) 
    { 
     t.data += x; 
     return t; 
    } 
}; 
+0

+1 для полноты - хотя я бы не стал упоминать «друг» –

1

В двух словах, оператор должен вернуть Test экземпляр:

class Test 
{ 
    ... 
    friend Test& operator<<(Test& test, int val); 
}; 

Test& operator<<(Test& test, int val) 
{ 
    test.data += val; 
    return test; 
} 
+0

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

+0

Не нужно делать его другом и публичной функцией, так как будет работать простая функция-член с одним параметром. –

+1

@ AndyCarter должно делать любое объяснение того, как 'operator <<' работает для ostreams из вашего учебника на C++. –

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