重载<<运算符 - 多个参数

And*_*ter 2 c++ encapsulation class operator-overloading

你们中的许多人可能在C++中知道以下内容:

cout << 1 << 2 << 3 << 4; // would produce 1234
Run Code Online (Sandbox Code Playgroud)

我正在尝试重新创建相同的东西 - 而是将其封装到一个类中,并将值递增为整数变量.

我收到错误:

错误:'int operator <<(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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ely 12

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

这种方式可以作为一系列具有两个参数的调用,例如

(((cout << 1) << 2) << 3) << 4;
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

cout << 1;
cout << 2;
cout << 3;
cout << 4;
Run Code Online (Sandbox Code Playgroud)

因此,您不要编写operator<<多个参数,它总是需要两个操作数,左操作数和右操作数.上面示例中的左操作数coutostream,int正在写入的操作数和右操作数.操作符返回左操作数,允许它在下一个操作中再次使用,依此类推,以便在<<链接在一起时执行多个操作.

因此,再次cout << 1返回cout,以便(cout << 1) << 2调用操作符将1写入流并返回流,然后再次对返回值调用操作符以将2写入流,然后再次返回流.

这只是胡说八道:

friend int operator<<(const int &x, const int &y)
{
    data += x;
    data += y;
}
Run Code Online (Sandbox Code Playgroud)

哪里data应该来自哪里?友元函数不是类的成员,所以没有this指针,所以不this->data,你声称返回int但不返回任何东西,这个类与完全无关Test.你写的是operator<<两个整数,即为了做1 << 2但运算符已经存在,它是bitshift运算符,你不能为内置类型重载它int.

你要:

class Test
{
private:
    int data;

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

    Test& operator<<(int y)
    {
        data += x;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

或者作为朋友:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)