在C ++中,当我想在初始化类对象数组时通过构造函数初始化类成员时,我该怎么办?

时间:2014-09-19 11:28:03

标签: c++ initialization

我以为我可以做到以下几点:

#include <iostream>

using namespace std;

class cl
{
  public:
    double* Arr;
    cl(int);
};

cl::cl(int i)
{
    Arr=new double[i];
    Arr[0]=11;
};

int main()
{
    cl* BB;
    BB=new cl(3)[3];      /* I want to initialize a class member Arr for each element of the class cl array BB when I initialize this array by means of constructor. What should I do? */
    cout << cl[1].Arr[0] << endl;                                                                                                   

    return 0;
}

但显然我注意到的那条线路出了问题。编译器不会编译。

4 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以使用大括号初始值设定项:

cl* BB = new cl[3] {1, 2, 3};

或更详细,因此很清楚数字作为参数传递给不同对象的构造函数:

cl* BB = new cl[3] {{1}, {2}, {3}}; 

虽然无论如何动态分配内存,但最好使用std::vector,如果你想用相同的参数初始化大量的对象,它也会更方便:

std::vector<cl> BB(300, 3);

但是,如果std::vector没有复制构造函数,cl初始化将无法编译。在这种情况下,您可以使用emplace_back()

vector<cl> BB;
BB.reserve(300);
for(int i = 0; i < 300; ++i)
    BB.emplace_back(3);

这反过来可以是wrapped into a template back_emplacer_iterator to use with std::fill_n

答案 1 :(得分:3)

有几种方法:

  • C ++ 11 initializer list

    cl* BB = new cl[3] {42, 42, 42};
    
  • STL-vector(推荐)

    std::vector<cl> BB( 3, cl( 42 ) );
    

作为pre-C ++ 11,还有其他更复杂的解决方案依赖于placement new运算符,但我不建议这样做。

答案 2 :(得分:1)

new-expression的格式是一个类型,后跟初始化程序。如果要分配3个cl个对象的数组,则类型为cl[3]。您不能说cl(3)[n]因为cl(3)不是类型。

在C ++ 03中,动态分配数组的唯一有效初始化程序是(),它对每个元素进行值初始化,但是由于类型没有默认构造函数,所以不能这样做。 / p>

在C ++ 11中,您可以使用initializer-list将参数传递给每个数组元素:

cl* ptr = new cl[3]{ 3, 3, 3};

答案 3 :(得分:0)

数组中的每个元素都将由默认构造函数(无参数构造函数)初始化。之后,您可以调用执行所需任务的任何功能。更正了程序示例:

class cl
{
  public:
    double* Arr;
    cl(int i = 0);
    ~cl();
    void allocArr(int i=0);
};

cl::cl(int i)
{
    allocArr(i);
}

void cl::allocArr(int i)
{
    if (i <= 0) {
        Arr = (double *) NULL;
    }
    else {
        Arr=new double[i];
        Arr[0]=11;
    }
};

cl::~cl() {
    if (Arr)
      delete [] Arr;
}

int main()
{
    cl* BB;
    BB=new cl[3]; // default constructor 
    for (int i = 0; i < 3; i++) {
        BB[i].allocArr(3);
    }

    cout << BB[1].Arr[0] << endl;                                                                                                   

    return 0;
}