1

そこでDictionary、ベースから継承し、IEnumerableタイプのメンバーを含むというクラスを作成しましたList。アイテム数を保存および公開Listするメンバーがあります。const unsigned int&

これはDictionaryのコンストラクタです。

Dictionary() : _list(), IEnumerable(_list.Count)
{ }

const unsigned int&「初期化された」リストからをに渡しIEnumerableます。問題は、 '初期化子が's(タイプのメンバー)のIEnumerable前に呼び出されているため、無効な参照を渡していることです。_listList

_list基本クラスの前にメンバーを強制的に初期化する方法はありますIEnumerableか?

4

2 に答える 2

4

基本クラスは、常に直接メンバーの前に初期化されます。(実際、mem-initializer-list 内のベースとメンバーの順序は何もしません。順序は常にクラス定義から決定されます。)

1 つの回避策は、メンバーを別の基本クラスに移動することです。

struct HasList {
    List _list;
    // Might want custom constructors here.
};

class Dictionary
    : private HasList,
      public IEnumerable
{
    // ...

private(これは、継承の数少ない有用な使用法の 1 つです。)

于 2013-02-10T21:56:14.320 に答える
0
  1. 基本クラスのコンストラクターは、継承されたクラスのコンストラクターの前に呼び出されます。
  2. メンバーは、宣言された順序(通常はヘッダー ファイル内) で初期化されます。初期化リストの順序は関係ありません。
于 2013-02-10T21:53:57.207 に答える