C ++运算符使用向量重载<<

时间:2019-11-13 15:24:27

标签: c++ vector operator-overloading operators

伙计们,我是C ++的新手,并且对此运算符有疑问:(在stackoverflow中也是新功能)

这是我的课程TestList:

class TestList{
public:
    TestList() : listItems(10), position(0){};
    TestList(int k) : listItems(k), position(0){};
    int listItems;
    int position;
    std::vector<int> arr;
};


//my current operator is: What should be changed?
ostream& operator <<(ostream&, const TestList& tlist, int input){
    os << tlist.arr.push_back(input);
    return os;
}
//

int main() {
testList testlist(5);
 testlist << 1 << 2 << 3; //how should I overload the operator to add these number to testlist.arr ?
 return 0;
}

我希望有人能帮助我或给我任何提示? :)

2 个答案:

答案 0 :(得分:1)

其他答案是绝对正确的,我只想在operator<<上说些普通话。由于它始终是二进制运算符,因此它始终具有签名T operator<<(U, V),因此它必须有两个自变量。自链条

a << b << c;

被评估为

(a << b) << c;
// That calls
operator<<(operator<<(a, b), c);

类型TU通常应该相同,或至少兼容。

此外,将operator<<的结果分配给某物(例如result = (a << b))是可能的,但很奇怪。一个好的经验法则是“我的代码不奇怪”。因此,类型T应该主要是引用(所以X&),因为否则它将仅是未使用的临时副本。在大多数情况下,这是毫无用处的。

因此,在所有情况的90%中,您的operator<<应该具有签名 T& operator<<(T&, V);

答案 1 :(得分:0)

我想你是说以下

TestList & operator <<( TestList &tlist , int input )
{
    tlist.arr.push_back( input );
    return tlist;
}

这是一个演示程序

#include <iostream>
#include <vector>

class TestList{
public:
    TestList() : listItems(10), position(0){};
    TestList(int k) : listItems(k), position(0){};
    int listItems;
    int position;
    std::vector<int> arr;
};

TestList & operator <<( TestList &tlist , int input )
{
    tlist.arr.push_back( input );
    return tlist;
}

std::ostream & operator <<( std::ostream &os, const TestList &tlist )
{
    for ( const auto &item : tlist.arr )
    {
        std::cout << item << ' ';
    }

    return os;
}

int main() 
{
    TestList testlist(5);

    testlist << 1 << 2 << 3;

    std::cout << testlist << '\n';

    return 0;
}

程序输出为

1 2 3

您甚至可以编写代替这两个语句的

testlist << 1 << 2 << 3;

std::cout << testlist << '\n';

只有一条语句

std::cout << ( testlist << 1 << 2 << 3 ) << '\n';

请注意声明中有错字

testList testlist(5);

应该有

TestList testlist(5);