3

クラス階層があり、これを禁止したい:

Foo *f = new Foo();
Bar *b = new Bar();

f = b;

FooのスーパークラスですBarBarこれを行うと、オブジェクトの一部がスライスされます。プライベートにすることでこれを解決できることは知っていますがoperator=、型が異なる場合にのみ代入演算子の使用を禁止することは可能ですか?

非公開にするのと同じoperator=ですが、これを許可します:

Bar *b1 = new Bar();
Bar *b2 = new Bar();

b1 = b2;

サブクラスも作成されると仮定Barします。

4

3 に答える 3

4

あなたはスライスについて話しているので、あなたが実際に防ごうとしているのはこれだと思います:

Foo f;
Bar b;

f = b;

この場合、はい、適切な operator= private にすることで割り当てを防ぐことができます。

ポインターの割り当てを防ぐことはできませんが、ポインターの割り当てによってスライスが発生しないことに注意してください。

于 2012-12-20T16:51:21.767 に答える
2

これは手の届かないところにあります。ユーザー定義演算子は、ユーザー定義 (組み込みではない) 型のパラメーターを少なくとも 1 つ受け取る必要があります。ポインターは組み込み型であるため、ここでは不運です。f = b何をしても合法です。

于 2012-12-20T16:50:55.703 に答える
0

あなたの例ではスライスは発生しません:

Foo *f = new Foo();
Bar *b = new Bar();

f = b;

値ではなくポインタを割り当てています。f ポインターと b ポインターは同じサイズ (実行しているアーキテクチャ上のポインターのサイズ) であるため、スライスなしで常に互いに適合します。オブジェクト自体はこの割り当ての影響を受けず、スライスされません。

しかし、これにより「new Foo()」がリークする可能性があります。代入後、f と b の両方が「new Bar()」を指し、削除できる「new Foo()」へのポインタがなくなります。

生のポインターの代わりに std::unique_ptr を使用することをお勧めします。これにより、削除が処理されます。

std::unique_ptr<Foo> newInstance()
{
    return new Foo();
}
于 2012-12-20T17:12:28.347 に答える