如何在数组上使用基成员初始化
How to use base member initialization on an array?
制作一个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-initializer或mem-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]... }
{
}
相关文章:
- C++成员初始化
- c++构造函数成员初始化:传递参数
- C++正确的指针成员初始化
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- WinLamb 错误:成员初始化非法
- 使用其他成员初始化结构的成员?
- C++模板类静态成员初始化
- 解释了构造函数成员初始化列表
- 如何在成员初始化列表中声明共享指针
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- C++11 默认类成员初始化与初始值设定项列表同时
- 调用非默认构造函数作为成员初始化
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 类成员初始化C++
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 如何调用成员初始化器列表中参考成员的构造函数
- C 构造函数采用成员初始化器
- 与其他静态const成员初始化静态常量成员
- 静态内联成员初始化顺序