重载operator <<来改变成员变量

fuj*_*uji 0 c++ class operator-keyword

我有一个看起来像这样的类:

class A {
  public:
    A() {};
    A& operator<< (A& a, unsigned int i);

  private:
    vector<int> abc;
}
Run Code Online (Sandbox Code Playgroud)

我想提供abc使用运算符添加对象的功能:

A a();
a << 3,4,5; // should do the same as several calls of abc.push_back(i)
Run Code Online (Sandbox Code Playgroud)

我知道我必须超载<<操作员,我是否还要超载,操作员?

实际方法怎么样?

jwi*_*mar 9

永远不会,在C++中重载运算符.语言允许它,但你不能这样做并保留操作符的预期行为.(特别是,逗号操作者是在C++中的序列点:编译器保证了左侧的表达式将在右边的表达式之前评估如果过载它,就不再存在哪些表达式将被评估的任何保证第一.)

您希望使用流插入运算符的多个调用来插入多个对象.

(出于完整性:日eother C++运算符,你应该永远是超负荷&&||再次,它不可能提供行为的客户端代码将期待(短路,在这种情况下).).


teh*_*atz 7

如果你想保持的方面a << 1, 2, 3,你可以改变你的超载operator<<来接受initializer_listint,而不是单一的,int.

#include <initializer_list>

class A {
    public:
    A() {};
    A& operator<< (std::initializer_list<int> values);

    private:
    vector<int> abc;
}
Run Code Online (Sandbox Code Playgroud)

然后实现它像:

A& A::operator<< (std::initializer_list<int> values)
{
    for(const auto& value : values)
        abc.push_back(value);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

只需使用如下:

A a;
a << {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

您需要确保的唯一事情是您具有提供这些功能的符合C++ 11的编译器.