在通过初始化程序列表询问有关聚合成员初始化的所有问题后,我仍然留下问号???我已经尝试过这两种方法来初始化私有成员数组。
class C {
C(const vector<int> &a): m_array(a) {} // using vector
private:
C(initializer_list<int> a): m_array(a) {} //using initializer list
int m_array[6];
};
以上两种方法抛出错误&#34;无法在visual studio 2010中为数组&#34; 指定显式初始化器。有人可以解释这些方法是否正确,如果是,那么为什么这些错误即将来临......
答案 0 :(得分:3)
这两种结构都要求数组的构造函数具有一个类型为std::vector<int>
或std::initializer_list<int>
的参数。但是,数组是聚合。他们没有带参数的构造函数。
您应该在构造函数的主体中初始化数组。
其中一种方法是将指向数组第一个元素的指针声明为参数,并在构造函数体内声明,以复制数据成员数组中的元素。
例如
C( const int *a, size_t n )
{
std::copy_n( a, std::min<size_t>( n, 6 ), array );
}
另一种方法是使用标准类std :: array。例如
std::array<int, 6> array;
C( std::array<int, 6> ): array(a) {}
在最后一种情况下,构造函数可以被称为
C( { 1, 2, 3, 4, 5, 6 } );
答案 1 :(得分:1)
当你说m_array(a)时。为了使其有效,m_array应该是某个类的对象,比如说ArrayClass,它应该有一个参数化的构造函数,它接受你指定的参数。
现在,在您的情况下,m_array表示指向数组m_array []的第一个元素的指针。很简单地说,构造函数被称为对象而不是指针。编写m_array(a)意味着你想要做m_array = a,这是根本错误的,因为数组是在堆栈上分配的,并且它的基地址不能被修改,你试图修改数组的基地址。
你能做的是