0

ポインターであるメンバー変数を持つクラスの場合、割り当て時にそれらを適切にメモリ管理することに注意を払う必要があるというヒントを得ました。次のメソッドは、メモリ リークを回避するためのものです。

class SomeClass {

SomeClass& SomeClass::operator =(SomeClass& from) {
    // clone
    if (&from != this) {
        this->dispose();
        this->clone(from);
    }
    return *this;
}

void SomeClass::clone(const SomeClass& from) {
    this->array = from.array;
}

void SomeClass::dispose() {
    delete[] this->array;
}
};

これがこれまでのところ正しいと仮定すると、次のことが可能ですか?

抽象メソッドとObjectを実装して持つスーパークラスを定義します。ポインター メンバーを持つクラスはすべてスーパークラスとして持つ必要があるため、それは継承され、実装する必要があることを思い出します。operator=clonedisposeObjectoperator=clonedispose

  • そのようなスーパークラスはどのように見えるでしょうか?
  • 継承によってこれを行うのは良い考えですか?
4

1 に答える 1

2

いいえ!これをしないでください。

まず、次のように宣言しoperator=()ます

SomeClass& SomeClass::operator =(const SomeClass& from);

に注意してconstください。新しいC++ 11標準には、例で示した移動セマンティックを許可する別の形式がありますが、代入演算子を次のように宣言します

SomeClass& SomeClass::operator =(SomeClass&& from);

に注意して&&ください。

このトピックの詳細な説明については、3の規則または C++11の 5 の規則を探してください。

あなたの質問に、代入演算子は継承されません。派生クラスで代入演算子を定義しない場合、コンパイラは既定の代入演算子を生成し、基本クラスの代入演算子を非表示にします。したがって、基本クラスの代入演算子は、派生クラスのクライアントによって表示されたり、使用されたりすることはありません。

代入演算子の詳細については、たとえばWhat is the copy-and-swap idiom? を参照してください。.

于 2012-12-04T15:51:32.220 に答える