gpt4 book ai didi

c++ - 用 operator=(赋值)定义部分复制是个好主意吗?

转载 作者:行者123 更新时间:2023-11-28 08:00:08 25 4
gpt4 key购买 nike

请考虑以下代码段:

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= 中。

最佳答案

[the references] are expected to always point to the 'parent' pins.

这是 ConnectionDevice 的不变量吗?如果是后者,请考虑此版本的 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 成员可以强制执行此操作;但这仅与 Connectionconst 接口(interface)一样有用。

关于c++ - 用 operator=(赋值)定义部分复制是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com