我以为我可以做到以下几点:
#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;
}
但显然我注意到的那条线路出了问题。编译器不会编译。
答案 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;
}