在通过初始化器列表询问有关聚合成员初始化的所有问题后,我仍然留下问号??我已经尝试了这两种方法来初始化私有成员数组。
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];
};
以上两个方法在visual studio 2010中都会抛出错误"cannot specify explicit initializer for arrays"。谁能解释一下这些方法是否正确,如果是,那么为什么会出现这些错误。
这两种结构都要求数组具有一个参数类型为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 } );
.
当你说m_array(a)。要使此操作有效,m_array必须是某个类(如ArrayClass)的对象,该类应该具有参数化构造函数,该构造函数接受指定的实参。
现在在你的例子中,m_array代表指向数组m_array[]的第一个元素的指针。很简单地说,构造函数是为对象而不是指针调用的。写m_array(a)意味着你想做m_array = a,这从根本上是错误的,因为数组是在堆栈上分配的,它的基址不能修改,你试图修改数组的基址。
你能做的是
- 将vector作为成员,该vector的构造函数负责处理 写你自己的数组类
- 使用指针(浅拷贝)