如何在构造函数中初始化数组

How do you initialize array in a constructor?

本文关键字:初始化 数组 构造函数      更新时间:2023-10-16

我希望能够将绑定小于最大大小的数组传递给构造函数并初始化私有数据成员。问题是我要么得到error: invalid initializer for array member 'option Program::long_options [10]',要么得到error: no matching function for call to 'Program::Program(const char [8], option [4], const char [5])'。唯一的选择是用无用的条目填充我传递给构造函数的数组。

class Program
{
public:
    Program(const char* pn, const option (&lo)[MAX_OPTS], const char* os);
private:
    option long_options[MAX_OPTS];
};
Program::Program(const char* pn, const option (&lo)[MAX_OPTS], const char* os)
    : program_name(pn), long_options(lo), opt_string(os)
{
}
option ex_lo[] = {
    { "help",    no_argument,       nullptr,               'h' },
    { "verbose", no_argument,       &helpdata.verbose_flag, 1  },
    { "output",  required_argument, nullptr,               'o' },
    LONG_OPTION_ZEROS
};
Program example("example", ex_lo, "hvo:");

我也尝试过使用矢量,但遇到了同样的问题:

    std::vector<option> long_options;
};
Program::Program(const char* pn, option (&lo)[MAX_OPTS], const char* os)
    : program_name(pn), long_options{std::begin(lo), std::end(lo)}, opt_string(os)
{
}

该语言不允许使用另一个数组初始化数组。

int arr1[] = {10, 20};
int arr2[] = arr1 // Not allowed. In this context, arr1 evaluates to `int*`.

这样可以防止类的数组成员变量在初始化项列表中从另一个数组初始化。

填充数组成员变量内容的唯一方法是在构造函数内部逐个设置其元素的值。

您可以对成员变量使用std::vectorstd::array,以使类更易于实现。

也许不是

option long_options[MAX_OPTS];

使用

option *long_options;

在这种情况下,寿命选项ex_lo[]和Program类的对象必须相等。

附言:对不起我的英语,我正在学习:)

ex_lolong_options是两个不同的数组。你不能把一个变成另一个。

你能做什么:

  • lo复制到long_options中-或-
  • long_options设为指向数组的指针(或者,我认为是引用)。这允许您将赋值保持在构造函数中

以下是初始化构造函数中对象数组的示例:

class B
{
public:
    B(int a, int b, int c)
    {
        std::cout << "Contructing B with " << a << b << c;
    }
};
class C
{
public:
    C(char a, bool b, std::string c)
    {
        std::cout << "Contructing C with " << a << b << c;
    }
};
class A
{
    B   m_b[2][2];
    C   m_c;
    A(int a, char b, bool c, std::string d):
    m_b{
        {
            {a,b,30},
            {a,b,30}
        },
        {
            {a,b,30},
            {a,b,30}
        }
    },
    m_c{b,c,d}
    {
        std::cout << "Contructing A with " << a << b << c << d << std::endl;
    }
};