通过new关键字分配复杂构造函数

4

我有一个疑惑。下面是一段代码片段。

我想使用new创建一个包含5个类对象的动态数组,但我想运行一个循环来使用循环计数器分配构造函数的第一个参数。就像这样:

class A {
    public:
        A(int _x, int _y):x(_x),y(_y) {}
    private:
        int x,y;
};

int main() {
    A* a = new A[5];   //compiler error
    for(i=0;i<5;i++) {
        a[i] = A(i, 10);
    }
}

请问有没有哪位可以告诉我正确的语法来实现这个,因为我没有简单构造函数?

6个回答

7

这一行

A* a = new A[5];

要求A具有默认构造函数。因此,一个简单的选项是向A添加一个默认构造函数:

 A(): x(), y() {} // zero-initializes x and y

请注意,在C++中,通常会使用 std :: vector<A> 来处理这种情况。它负责所有内存管理,因此不必显式调用 new 和 delete 。它还可以动态调整大小。这将构造具有五个默认构造的 A 对象的 std :: vector<A> :
std::vector<A> a(5);

虽然你可能想要创建一个空的数组,并在循环中将值推入其中。
std::vector<A> a;
for(i=0;i<5;i++) {
    a.push_back(A(i, 10));
}

3
A* a = new A[5]; 

试图使用 A 类的默认构造函数来构造 5A 类型的对象,但该构造函数在你的类中不存在。你应该实现它:

class A {
    public:
        A() : x_(0), y_(10) { }                 // default constructor
        A(int x, int y) : x_(x), y_(y) { }
    private:
        int x_;
        int y_;
};

但请注意,最好使用std::vector代替动态分配的数组:

std::vector<A> a(5);

这也使用默认构造函数构造了5个类型为A的对象 :)


1
由于您没有不带参数的构造函数,您可以选择执行以下操作:
A(int _x = 0, int _y = 0):x(_x),y(_y) {}

或者

A() : x(0), y(0) {}

而不是使用 for 循环,写成:

for(i=0;i<5;i++) {
    a[i].set(i, 10);
}

使用适当的方法set

0
如果您不想定义默认构造函数,请尝试以下方法:
int main() 
{    
    A* a[5];
    for(int i=0;i<5;i++) {
      a[i] = new A(i, 10);
    }
}

在C++代码中,通常不建议使用O(n)的内存分配和失去局部性。 - Konstantin Oznobihin
这就像是基于向量和基于列表的方法。两者都有优缺点! - Arun
你认为你的建议有哪些优点? - Konstantin Oznobihin
如果 A* a = new A[MAX]; // MAX 很大,内存分配失败怎么办?尽管这是 O(n) 的内存分配,但即使由于某些原因堆分配失败,我们至少会有一些对象被构造出来。 - Arun
取决于情况!我们可能仍然有一些对象被构建。如果可行,就利用它们 :) - Arun
显示剩余2条评论

0

你有两个选择:

  • 要么使用 A** a = new A*[5]a[i] = new A(i, 10),也就是一个指向 A 的指针数组,而不是一个对象数组。

  • 要么在你的类中包含一个默认构造函数 A(): x(0), y(0) {} 或者只是给你现有的构造函数添加默认参数。

你当前的编译器错误是因为 new A[5] 构建了 5 个连续的 A,为此它分配了 5 * sizeof(A) 字节的内存,并调用了 5 次 A 的默认构造函数(即没有任何参数的构造函数),但是你的类 A 中没有提供这个默认构造函数。


1
不需要用户提供赋值运算符。 - juanchopanza
这个类确实不需要。我从我的答案中将其删除了,谢谢。 - Antoine

0
问题在于您没有默认构造函数。当您调用 new 时,它需要以某种方式创建对象,但无法完成此操作。您必须提供一个(即使用零初始化 x 和 y 的构造函数)或者如果 C++11 是可选项,则使用 初始化列表

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接