【问题标题】:Overloading operators and writing manipulators?重载运算符和编写操纵器?
【发布时间】:2012-01-06 22:34:12
【问题描述】:

好的,我无法让这段代码工作: 我想连接我的自定义操纵器。 所以他们会像cout << endl一样被调用。 例如我想要这个:

   emit << event1 << event2 << event3;

这是我的代码:

class Emit
{
public:
                // ...
    const void operator<<(const Event& _event) const;
}const emit; // note this global

inline const void Emit::operator<<(const Event& _event) const
{
    Start(_event);
}


class Event 
{
               // ...
         const Event& Event::operator<<(const Event& _event) const;
};

inline const Event& Event::operator<<(const Event& _event) const
{
    return _event;
}

但是我不能这样称呼:

 emit << event1 << event2 << event3;

我收到编译时错误、链接时错误以及我在代码中所做的任何更改都会收到相应的错误,但没有成功。

例如这个:

错误 1 ​​错误 C2679: 二进制 '

非常感谢。

【问题讨论】:

    标签: c++ overloading operator-keyword


    【解决方案1】:

    这些运算符是从左到右调用的。因此,第一次调用 (emit &lt;&lt; event1) 必须返回对 Emit 的引用:

    class Emit
    {
    public:
        // ...
        Emit const& operator<<(const Event& _event) const;
    }const emit; // note this global
    
    Emit const& Emit::operator<<(const Event& _event) const
    {
        Start(_event);
        return *this;
    }
    

    现在您不再需要在 Event 类中重载 operator&lt;&lt;

    【讨论】:

    • ahahah :D 我现在明白了,非常感谢 Xeo,你刚刚救了我键盘的命!你的代码就像一个魅力。
    【解决方案2】:

    如果您的操纵器不包含任何数据,您实际上可以只编写一个函数。例如,std::endl 的实现大致是这样的(它也需要处理宽流,因此可以安排转换字符):

    std::ostream& endl(std::ostream& out) {
        (out << '\n').flush();
        return out;
    }
    

    如果您的操纵器有一些数据,您需要将数据存储在合适的对象中,然后为此类创建一个正常的输出运算符,例如 std::setw() 可以这样实现(再次忽略流实际上是模板):

    struct std::setw {
        setw(int size): size_(size) {}
        int size_;
    };
    std::ostream& operator<< (std::ostream& out, std::setw const& object) {
        out.width(object.size_);
        return out;
    }
    

    您可以将输出运算符实现为成员,因为您不控制operator&lt;&lt;() 的左侧:这是流对象所在的位置。如果您正在实现std::ostream,您可以实现这些成员(实际上,标准要求某些输出运算符是std::ostream 的成员)。

    【讨论】:

    • 哦,非常感谢您提供的宝贵信息,投票+,但自从 Xeo 在 minit 中发帖以来,我已经接受了他的回答。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2016-02-19
    • 2011-10-18
    相关资源
    最近更新 更多