2

次のような状況があります。スーパークラスconstのメンバーを宣言しましたが、リスト初期化子を使用して、そのサブクラスの 1 つのコンストラクター内で初期化したいと考えています。

struct Shape {
public:
    const Rect boundingRect; // the rect in which the shape is contained
};

struct Stain : Shape
{
public:
    Stain(Rect boundingRect_) : boundingRect(boundingRect_) {}
};

これが可能かどうかはわかりません。上記の簡単な方法を使用すると、コンパイラは次のメッセージを表示します。

member initializer 'boundingRect' does not name a non-static data member or base class

この回答は、サブクラスのコンストラクターのリスト初期化子でスーパークラスのメンバー変数を初期化できない理由を説明しています。そのような状況でのベストプラクティスは何だろうかと思いますか?

4

2 に答える 2

4

コンストラクターを追加してstruct Shape、サブクラスから呼び出す必要があります。そのようです:

struct Shape {
public:
    const Rect boundingRect; // the rect in which the shape is contained

    Shape( Rect rect ) : boundingRecT( rect ) {}
};

struct Stain : Shape
{
public:
    Stain(Rect boundingRect_) : Shape (boundingRect_) {}
};
于 2015-03-10T11:07:56.710 に答える
2

ここでは、クラスのメンバー変数と基本クラスのみを初期化できます (基本クラスのメンバーは初期化できません)。

解決策はShape、イニシャライザを受け入れるコンストラクタを指定することです。次に例を示します。

Shape(Rect rect): boundingRect(rect) {}

次のようにStain呼び出します。

Stain(Rect boundingRect_): Shape(boundingRect_) {}

このコンストラクターを一般大衆に使用させたくない場合は、それを作成できますprotected:

于 2015-03-10T11:07:07.183 に答える