0

请考虑以下代码段:

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=.

4

1 回答 1

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成员可以强制执行;但这仅constConnection.

于 2012-07-28T08:15:22.887 回答