繁体   English   中英

C ++重载运算符'>>'

[英]C++ overload operator '>>'

我一直在寻找很多不同的例子和解释,但没有一个真正回答我正在寻找的东西。 我有三个类,每个类都有一个名为connect的方法:

class foo { ... }
void foo::connect(bar br) { ... }

class bar { ... }
bar& bar::connect(baz bz) { ... }

class baz { ... }
baz& baz::connect() { ... }

在我的主要课程中,我将它们连接起来:

foo.connect(bar);
bar.connect(baz);
baz.connect();

要么:

foo.connect( bar.connect( baz.connect() ) );

(我知道这是简要说明,如果需要,我可以更好地解释)

所以,我试图重载运算符'>>'在main函数中有这样的东西:

foo >> bar >> baz;

对于它运行的第一个运算符,所以如果我只是执行以下操作,它可以正常工作:

foo >> bar.connect(baz.connect);

但是,当我设置另一个'>>'运算符时,g ++会返回此错误:

error: no match for ‘operator>>’ in ‘operator>>((* & foo), (* & bar)) >> baz.baz::connect()’

我想我没有正确地重载运算符'>>':

bar& operator>> (bar &br, baz &bz)
{
  ...
}

谢谢您的帮助 :)

操作员不是什么神奇的东西:它们只是以有趣的方式拼写的功能。 那就是你的陈述

foo >> bar >> baz;

实际上只是打电话[或试图打电话]

operator>> (operator>> (foo, bar), baz);

也就是说,你需要运营商

bar& operator>> (foo& f, bar& b) {
    f.connect(b);
    return b;
}
bar& operator>> (bar& b0, baz& b1) {
    return b0.connect(b1);
}

注意,使用operator>>()您使用的最后一个connect()是不可行的,因为运算符总是带两个参数。

虽然您没有显示它,但证据表明您的其他操作员是问题所在。 它看起来像这样:

foo& operator>>(foo&, bar&) { ... }

但为了使这个工作:

foo >> bar >> baz;

你可能希望foo >> bar返回bar (不是foo ),这样下次调用就是这个函数:

??? operator>>(bar&, baz&) { ... }

为了保持一致性,这可能应该返回baz& ,尽管在这种情况下并不是绝对必要的。

你拥有它的方式(因为foo >> bar返回foo ),第二个operator>>试图调用它(我假设不存在)函数:

??? operator>>(foo&, baz&) { ... }

您的重载运算符将bar&作为其左侧操作数和baz&作为其右侧操作数,但您的示例代码:

foo >> bar.connect(baz.connect);

有一个foo&作为左手操作数和一个bar&作为右手操作数。 你还定义了另一个版本的operator>>

另请注意,引用示例代码,这个:

foo.connect(bar);
bar.connect(baz);
baz.connect();

与此不一样:

foo.connect( bar.connect( baz.connect() ) );

操作顺序不同; 在第二个示例中, baz.connect()运行baz.connect() ,然后运行bar.connect() ,依此类推。 这与第一个例子相反。 这在您的应用程序中可能无关紧要,但需要考虑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM