操作符=可能不是一个成员吗?

3

构造形式:

struct Node
{
Node():left_(nullptr), right_(nullptr)
{ }
int id_;
Node* left_;
Node* right_;
};

我想启用语法:

Node parent;
Node child;
parent.right_ = child;

所以为了做到这一点,我需要:

Node& operator=(Node* left, Node right);

但是我收到了operator=必须是成员函数的消息,有没有办法绕过这个限制?

4个回答

5

为什么不直接使用parent.right_ = &child? 如果可能的话,创建一个将值类型分配给指针的重载运算符将是一个非常糟糕的主意。它会使真正发生的事情变得模糊,并使那些阅读代码的人难以理解。

嗯,你已经接受了一个答案,但无论如何,你可以像编写Boost.Format的人一样,选择一些其他运算符,可以作为非成员函数进行重载,并具有低冲突潜力(他们选择了%)。在我看来,这稍微不那么难以理解。


因为在指针上有操作符,所以我可以在一个步骤中对子对象进行相同的赋值(在此运算符体内)。 - There is nothing we can do
所以你想要实现一个双向链表/树或者你想要链接赋值? - Björn Pollex
我正在做TC++PL的练习,我只是想按照我提到的方式来完成它。 - There is nothing we can do
增加了一个可能会对您感兴趣的建议。 - Björn Pollex
在我看来,这样稍微不那么晦涩难懂。
  • 我认为你可能是孤军奋战。
- anon

4

Operator =() 必须是成员函数。而且你不能重载指针的赋值含义。


2

将值转换为指针的自动转换会导致代码难以理解。

如果您仍然想这样做,可以在Node类上提供一个转换运算符:

operator Node* () { return this; }

1
@Neil Butteerworth 但我认为他举这个例子是作为警示。他并不声称这是更好的方式。 - There is nothing we can do

2

替换

parent.right_ = child;

parent.right_ = &child;

这样就可以了;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接