如何初始化类类型变量的成员数组
How to initialize a member-array of class type variables?
我想创建一个 10 个Foo
的成员数组,每个成员数组初始化为 Foo(8, "10")
,如下所示:
Foo bar = new Foo(8, "10")[10]; //like this
我怎样才能做到这一点?
假设你想初始化 10 个 Foo
类型的对象,你应该在C++中使用一个vector
:
std::vector<Foo> foos( 10, Foo(8, "10"));
最简单的方法是使用这样的std::vector
:
struct A {
std::vector<Foo> bar;
A() : bar(10, Foo(8, "10")) {}
};
std::vector
可以像普通数组一样使用,再加上此处记录的一些简洁的额外功能。
如果vector
证明的动态分配太慢,并且10
数是编译时常量,则可以改用std::array
。但是,语法并不那么漂亮,差异很可能可以忽略不计。
如果数组的大小恒定且较小,则可以使用:
foo array_of_foos[3] =
{
foo(8, "10"),
foo(8, "10"),
foo(8, "10")
};
唯一的另一种方法是使用 for() 循环,但要使其正常工作,foo还必须具有无参数构造函数(又名 foo()
)
Xtofl 使用向量的答案也有效,假设您可以使用向量而不是数组。
如果数组的大小较小,则可以为数组的每个元素显式指定初始值设定项。
例如
#include <iostream>
struct A
{
A( int x, int y ) : x( x ), y( y ) {}
int x, y;
};
int main()
{
const size_t N = 10;
A *a = new A[N]
{
{ 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 },
{ 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 }
};
for ( size_t i = 0; i < N; i++ ) std::cout << a[i].x << ' ' << a[i].y << std::endl;
delete [] a;
}
程序输出为
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
但是,如果您要动态分配数组,那么更好的方法是使用在标头 <vector>
中声明的标准类std::vector
。
您可以使用与示例相同的初始值设定项列表
std::vector<A> v =
{
{ 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 },
{ 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 }
};
或者您可以先使用默认值初始化所有元素
std::vector<A> v( N, { 0, 0 } );
然后使用例如标准算法(如std::fill
、std::generate
等)重新分配它们。
相关文章:
- 是否可以将结构数组别名为结构成员数组?
- C++:初始化 constexpr 构造函数中的成员数组
- 使用带有参数包的数组的成员数组初始化类
- C++ 在析构函数调用之前删除的动态成员数组
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 指向具有不同大小的成员数组的指针
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 对象成员数组C++默认初始化
- 如何在构造函数中的类成员数组中分配数组值,而无需使用STD库
- 将类成员数组组合到单个数组时性能下降
- 如何将数据从公共方法添加到同一类中的私有成员数组中?
- 如何在C 中的派生类中分配数据成员数组
- C 集合构建器中类成员数组的2D数组大小
- 初始化不可复制、不可移动、显式构造类型的成员数组
- C 指针可以指向字符串文字的静态成员数组
- 成员数组位于何处
- 将对象成员数组与字符串进行比较
- 如何在 c++ 中从对象数组中获取数据成员数组
- 声明模板会员参考另一个类的模板成员数组
- C 初始化成员数组