0

我正在为运算符重载而苦苦挣扎,因为我希望它允许链接

class A{
 int a;
public:
 void doSomething(char *str);
 A operator<<(char *str);
}

所以我有这门课,我能做的就是拿一个字符串做一些事情,这对这个问题并不重要。

我现在能做的是

A *counter = new A();
counter->doSomething("hello");

如果我实现重载的移位运算符

A A::operator<<(char *str)
{
  this->doSomething(str);
  return this;
}

我可以这样写

A *counter = new A();
(*counter) << "hello";

我希望我在这里没有犯错,因为现在我想知道如何允许链接

(*counter) << "hello" << "test";

我知道通过链接它会做到这一点

(*counter).operator<<("hello" << "test");

这显然没有任何意义,因为有两个字符串/字符数组但我知道有一种方法可以做到这一点。我用谷歌搜索了它,但每个问题都只是关于将相同类型的实例链接在一起

然后我尝试将两个参数放入函数并将其添加为朋友...我不确定,但也许我必须使用类型char*或流对象创建一个新的重载运算符并将其作为朋友A

感谢您帮助我,我想应该有一个我现在看不到的简单答案。

4

4 回答 4

5

您需要返回对 的引用*this,因此您的返回类型必须是A&

A& operator<<(char *str)
{
  this->doSomething(str); // as before
  return *this;           // return reference to this instance.
}
于 2013-07-22T08:25:54.090 回答
2

我想澄清你的问题中有两个错误的假设。

  1. 当你想调用operator<<指针时,你必须为每次调用都这样做,而不仅仅是第一次。这就是为什么

    A *counter = new A();
    (*counter) << "hello";
    

    有效,但是

    (*counter) << "hello" << "test";
    

    没有。第二个operator<<将在第一个返回的指针上调用 ,这不是您想要的。你必须写(这很难看):

    (*((*counter) << "hello")) << "test";
    
  2. 移位运算符可以链接起来,然后从左到右进行评估,这就是为什么以下是另一个错误假设的原因:

    A << "hello" << "test";
    

    我知道通过链接它会做到这一点

    A.operator<<("hello" << "test");
    

    它实际上是这样评估的:

    A.operator<<("hello").operator<<("test");
    

    也就是说,更详细:

    ( A.operator<<("hello") ).operator<<("test");
    

operator<<如果返回的对象也实现了链接运算符,那么您可以返回其类型为operator<<的副本。但是,这会复制不必要的对象,因为它很可能只是临时存在的,并且仅由以下操作员使用一次。*thisA

所以你想要做的是返回一个引用operator<<在它上面operator<<可以调用下一个。这避免了复制:

A& operator<<(char *str)
{
    this->doSomething(str);
    return *this;
}

如上所述,返回指针是可能的,但不会产生您想要的结果。语法会非常难看。

于 2013-07-22T08:42:23.617 回答
1

operator <<应该返回链接的参考。

A& operator<<(char *str);

A& A::operator<<(char *str)
{
  this->doSomething(str);
  return *this;
}

应该像这样使用

A counter;
counter << "hello" << "test";
于 2013-07-22T08:25:25.727 回答
0
A *counter = new A();

使您的“计数器”成为指针,而不是对象。要在 A 上使用运算符,您可以使用

(*counter) << "hello" 

此外,我建议您重新考虑重载运算符。虽然一开始这似乎是一个很酷的想法,但它很容易导致代码难以理解和维护。

于 2013-07-22T08:31:09.113 回答