私有成员数组初始化通过构造函数初始化程序在c ++中的列表

时间:2014-05-23 11:41:48

标签: c++ arrays initializer-list

在通过初始化程序列表询问有关聚合成员初始化的所有问题后,我仍然留下问号???我已经尝试过这两种方法来初始化私有成员数组。

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; 指定显式初始化器。有人可以解释这些方法是否正确,如果是,那么为什么这些错误即将来临......

2 个答案:

答案 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,这是根本错误的,因为数组是在堆栈上分配的,并且它的基地址不能被修改,你试图修改数组的基地址。

你能做的是

  1. 将一个向量作为成员,该向量的构造函数将注意 复制元素。
  2. 编写自己的数组类。
  3. 使用指针(浅拷贝)