我希望能够将绑定小于最大大小的数组传递给构造函数并初始化私有数据成员。问题是我得到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)
{
}
答案 0 :(得分:1)
该语言不允许您使用其他数组初始化数组。
int arr1[] = {10, 20};
int arr2[] = arr1 // Not allowed. In this context, arr1 evaluates to `int*`.
这可以防止类的数组成员变量在初始化列表中从另一个数组初始化。
填充数组成员变量内容的唯一方法是在构造函数体内逐个设置其元素的值。
您可以使用std::vector
或std::array
作为成员变量,以便让您的课程更易于实施。
答案 1 :(得分:0)
ex_lo
和long_options
是两个不同的数组。你不能让一个人进入另一个人。
你能做什么:
lo
复制到long_options
。 -OR - long_options
成为数组的指针(或者,我认为是参考)。这允许您按原样在构造函数中保留赋值。答案 2 :(得分:0)
也许不是
option long_options[MAX_OPTS];
使用
option *long_options;
在这种情况下,生命时间选项ex_lo [] 和Program类的对象必须是等于。
P.S。对不起我的英语,我正在学习:)。
答案 3 :(得分:0)
以下是在构造函数中初始化对象数组的示例:
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;
}
};