2013-05-18 48 views
1

做一個二十一點遊戲,並需要知道如何使用基本成員初始化來初始化一個數組(即使用一元範圍解析運算符在構造函數中進行初始化)。如何在數組上使用基本成員初始化?

//Constructor 
Card::Card() 
:mRank(static_cast<Rank>(ACE)), mSuit(static_cast<Suit>(SPADES)), mRankText(), mSuitText() 
{ 
} 

欲破爛陣列mRankText和mSuitText初始化到

const char * rankText[NUMBER_OF_RANKS] = {"Ace", 
              "Deuce", 
              "Trey", 
              "Four", 
              "Five", 
              "Six", 
              "Seven", 
              "Eight", 
              "Nine", 
              "Ten", 
              "Jack", 
              "Queen", 
              "King"}; 

const char * suitText[NUMBER_OF_SUITS] = {"Spades", 
              "Clubs", 
              "Diamonds", 
              "Hearts"}; 

回答

3

基座構件初始化(即,使用一元範圍解析操作者一個構造內intializing)。

它被稱爲構造函數初始化程序MEM-初始化列表(或只是一個「構造函數初始化列表」),並有作爲「一元作用域運算符」這就是所謂的冒號沒有這樣的事!

此前C++ 11你不能做到這一點,你只能保持數組初始化或所有成員初始化爲零(這是你的代碼現在正在做。)

在C++ 11你可以使用統一的初始化用大括號:

//Constructor 
Card::Card() 
: /*...*/, mRankText{ a, b, c }, mSuitText{ d, e, f, g } 
{ 
} 

,需要明確指定每一個元素,自動化它,你需要使用一個委託構造器和可變參數模板。以下使用將在C++ 14中使用的std::index_sequence類型,但您可以使用我的integer_seq.h實現:

//Constructor 
Card::Card() 
: Card(std::make_index_sequence<NUMBER_OF_RANKS>(), 
     std::make_index_sequence<NUMBER_OF_SUITS>()) 
{ } 

template<size_t... R, size_t... S> 
Card::Card(std::index_sequence<R...>, std::index_sequence<S...>) 
: /*...*/, mRankText{ rankText[R]... }, mSuitText{ suitText[I]... } 
{ 
}