请考虑以下代码段:
class Pin
{
public:
Pin()
{
}
};
class Connection
{
Pin& _from;
Pin& _to;
public:
Connection(Pin& from, Pin& to)
: _from(from), _to(to)
{
}
};
class Device
{
Pin _a, _b;
Connection _int_conn;
public:
Device()
: _int_conn(_a, _b)
{
}
};
现在我想定义operator=
,以便Device
可以相互复制:
int main()
{
Device a, b;
a = b;
}
当然,默认operator=
是不够的,因为Connection
类包含两个引用。但是对于这个特定的操作,需要Device
复制所有其他属性并保持引用完整(因为它们总是指向'父'引脚)。
另一方面,用户也可以使用Connection
类,然后这两个引脚可以属于任何其他类。在这种情况下,虽然复制其他属性可能是有益的,但使用operator=
似乎有点不正确。换句话说:
int main()
{
Pin a, b, c, d;
Connection y(a, b), z(c, d);
y = z;
}
复制非参考成员对我来说似乎不对。
此外,如果我决定更改对指针的引用,我可能也希望operator=
复制它们。
我在这儿吗?什么是最好的行动方案?我想考虑定义一个额外的方法,如:
void Connection::copy_properties(Connection& rhs)
或只是在Device::operator=
中复制它们。
答案 0 :(得分:1)
[引用]应始终指向“父”引脚。
这是Connection
还是Device
的不变量?如果是后者,请考虑此版本的Connection
:
class Connection
{
Pin* _from;
Pin* _to;
public:
Connection(Pin& from, Pin& to)
: _from(&from), _to(&to)
{}
};
也就是说,这个版本有一些更明显的复制语义。然后Device::operator=
现在必须确保不要破坏Device
不变量(例如,在保持_int_conn
不变的情况下分配任何需要分配的内容)。实际上,_int_conn
const
成员可以强制执行此操作;但这只与const
的{{1}}界面一样有用。