2

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

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

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

我得到错误:

错误:'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;
}
4

2 回答 2

13

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

这种工作方式是作为带有两个参数的一系列调用,例如

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

这大致相当于:

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

所以你不要写一个operator<<带多个参数的,它总是需要两个操作数,左操作数和右操作数。上面示例中的左操作数是coutie,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<<for two int ie for doing1 << 2但那个操作符已经存在,它是 bitshift 操作符,你不能为内置类型重载它,比如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;
    }
};
于 2013-06-12T11:41:08.433 回答
2

简而言之,操作员需要返回Test实例:

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

Test& operator<<(Test& test, int val)
{
    test.data += val;
    return test;
}
于 2013-06-12T11:37:00.193 回答