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;
}

もちろん、クラスは 2 つの参照を保持しているoperator=ため、デフォルトでは十分ではありません。Connectionただし、この特定の操作では、Device他のすべてのプロパティをコピーし、参照をそのままにしておくことが望ましいです (参照は常に「親」ピンを指すことが期待されるため)。

一方、Connectionクラスはユーザーも使用でき、2 つのピンは他のクラスに属することができます。この場合、他のプロパティをコピーすることは有益かもしれませんが、それを使用するのは少し間違っているよう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_connconstメンバーを作成すると、それを強制できます。constしかし、それは のインターフェースと同じくらい有用ですConnection

于 2012-07-28T08:15:22.887 に答える