在 C++ 中对象数组的定义处设置类对象数组的初始值
Posted
技术标签:
【中文标题】在 C++ 中对象数组的定义处设置类对象数组的初始值【英文标题】:set class object array init value at definition of object array in C++ 【发布时间】:2020-11-26 12:22:48 【问题描述】:我有两个问题。我运行下面的代码并将每个数组对象变量设置为 20 ın GCC 6.3 version.
但是,当我尝试更高版本的 GCC 时,它给出了一个错误。
为什么会发生这种变化?
#include <iostream>
class A
int a;
public:
A(int);
;
A::A(int init_val)
this -> a = init_val;
int main()
A a[10](20);
实际上,我想为这样的构造函数设置一个具有更多参数的数组:
A(int, char);
A a[10](20, 'A');
代码的最终版本如下。 这会在每个 gcc 版本中产生错误。
有没有办法设置这样的数组对象?
#include <iostream>
class A
int a;
char b;
public:
A(int, char);
;
A::A(int init_val, char init_ch )
this -> a = init_val;
this -> b = init_ch;
int main()
A a[10](20, 'A');
【问题讨论】:
【参考方案1】:不,没有办法像在 C++ 中那样初始化数组。您的任何尝试都不是正确的。
您可以像这样显式初始化每个元素:
A a[10]
20, 'A',
20, 'A',
20, 'A',
20, 'A',
20, 'A',
20, 'A',
20, 'A',
20, 'A',
20, 'A',
20, 'A',
;
如果元素类型是默认可构造的(您的类是 not)并且可以复制分配(您的类是),那么您可以在默认情况下解决无法解决的问题初始化,稍后分配元素。例如:
A a[10];
std::fill_n(a, std::size(a), A20, 'A');
【讨论】:
没有默认 ctor,这是正确的。如果您可以添加一个,您可以使用std::fill_n(a, 10, A20, 'A');
以获得更好的语法。另见here【参考方案2】:
如果初始化器是实际的编译时间常数值,你可以添加一个默认的ctor:
class A
...
A(): a(20)
但我知道在一般情况下没有干净的方法。如果您可以使用动态对象,则有一种可能的解决方法:使用矢量和emplace_back
对象。最后,向量将包含一个对象数组:
va = std::vector<A>;
va.reserve(10)
for (i=0; i<10; i++)
va.emplace_back(20, 'a');
A *a = va.data(); // you now have a array of 10 A objects
只要您需要数组存在,您只需使 backing 向量持续...
【讨论】:
以上是关于在 C++ 中对象数组的定义处设置类对象数组的初始值的主要内容,如果未能解决你的问题,请参考以下文章