2013-02-10 49 views
1

因此,我製作了一個名爲Dictionary的類,該類繼承自基礎IEnumerable幷包含List類型的成員。 List有一個const unsigned int&成員,用於存儲和公開其項目數。Initializer list not order

這是Dictionary的構造函數。

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

我從 「初始化」 列表IEnumerable通過const unsigned int&。問題是,IEnumerable的初始化程序在_list的(List類型的成員)之前被調用,所以我傳遞了無效的引用。

有沒有辦法強制成員_list在基類IEnumerable之前初始化?

+0

如何設置'List'的'Count'數據成員?這是一個參考,所以它必須提到某件事。它在_list的構造函數中被設置爲 – juanchopanza 2013-02-10 21:54:58

+0

。但是,這是基地後 – 2013-02-10 22:00:18

回答

4

基本類總是在直接成員之前初始化。 (實際上,mem-initializer-list中的基礎和成員的順序什麼都不做 - 順序總是從類定義中確定的。)

一種解決方法是將您的成員移動到另一個基類。

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

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

(這是private繼承的一些有用的用途之一。)

+0

哦,我明白了。我喜歡!聽起來很新穎。我想我會這樣做:) – 2013-02-10 22:01:27

+0

完美!再次感謝。它甚至不需要對現有代碼進行任何重大更改:) – 2013-02-10 22:11:01

0
  1. 在繼承類的構造函數之前調用基類構造函數。
  2. 成員初始化的順序是,聲明爲(通常在頭文件中),初始化列表的順序是不相關的。
相關問題