如何在数组上使用基成员初始化

How to use base member initialization on an array?

本文关键字:成员 初始化 数组      更新时间:2023-10-16

制作一个21点游戏,需要知道如何使用基本成员初始化数组(即使用一元范围解析操作符在构造函数中初始化)

//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"};

基本成员初始化(即在构造函数中使用一元作用域解析操作符进行初始化)。

它被称为ctor-initializermem-initializer-list(或者只是一个"构造函数初始化列表"),并且没有所谓的"一元范围解析操作符"称为冒号!

在c++ 11之前,你不能这样做,你只能不初始化数组或将所有成员初始化为零(这就是你的代码现在所做的)

在c++ 11中,你可以使用大括号来统一初始化:

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

这需要显式地指定每个元素,为了使其自动化,您需要使用委托构造函数和可变模板。下面使用的是std::index_sequence类型,它将在c++ 14中出现,但你今天可以用我的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]... }
{
}