0

独立したクラスの場合、コピー コンストラクターで代入演算子を呼び出さないようにする必要があることはわかっています。再利用されたコードをコピーして交換し、プライベート メンバー関数に移動することは、コードを簡単に再利用するための 2 つの方法です。しかし、最近、私はちょっとした問題に遭遇しました。コードは次のとおりです。

// Derived.h
class Derived : Base {
  // bunch of fun stuff here
  // ...
  // constructor that builds a derived object from a base one
  explicit Derived(const Base& base);
  // Assignment operator for moving base class member variables into the derived one
  Derived& operator=(const Base& base);
};
// Derived.cpp
Derived::Derived(const& Base base) {
  *this = base; // use assignment operator from derived to base
}
Derived& Derived::operator=(const Base& base) {
  static_cast<Base>(*this) = base;  // call base class assignment operator
}

この特定のアプリケーションでは、派生クラスは基本クラスから受け取ったばかりのメンバーに対して操作を実行して、オブジェクトの残りの部分を埋めることができるため、これはすべて実際に理にかなっています。また、これにより、ユーザーは基本オブジェクトを派生オブジェクトに安全に変換できます。私が見逃しているように見えるのは、そのようなコードが優れたコードプラクティスであるかどうか、または私がやろうとしていることを達成するためのより簡単でより良い方法があるかどうかです? 前に述べたように、独立したクラスのコピー コンストラクターから代入演算子を呼び出すことは一般的に禁止されていることはわかっていますが、別のコンストラクターから代入演算子を呼び出す場合はどうでしょうか。

4

2 に答える 2

8
Derived::Derived(const Base& base) {
  *this = base;
}

Baseこれは、構築されたオブジェクト内のサブオブジェクトをデフォルトで構築し、Derivedそれを割り当てます。あなたはもっとうまくいくかもしれません:

Derived::Derived(const Base& base)
  : Base(base)
{
}

のコピー コンストラクタを使用しますBase

于 2013-06-26T00:58:14.937 に答える