在 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++ 中对象数组的定义处设置类对象数组的初始值的主要内容,如果未能解决你的问题,请参考以下文章

C++对象数组与对象指针

在 C++ 中初始化对象数组时出错

在c++中如何调用数组对象的构造函数

C++中关于类对象的初始化问题

如何在 C++ 中的子类中创建父对象数组?

对象初始化