通过new分配复杂的构造函数

时间:2013-03-15 12:25:12

标签: c++ constructor

我有一种困惑。以下是代码段。

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

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 个答案:

答案 0 :(得分:7)

这一行

A* a = new A[5];

要求A是默认可构造的。因此,一个简单的选择是将默认构造函数添加到A

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

请注意,在C ++中,人们通常倾向于在这种情况下使用std::vector<A>。它需要所有内存管理,因此没有必要明确调用newdelete。它也可以动态调整大小。这将构造一个std::vector<A>,其中包含五个默认构造的A对象:

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

虽然您可能想要创建一个空的并在循环中将值推入其中。

std::vector<A> a;
for(i=0;i<5;i++) {
    a.push_back(A(i, 10));
}

答案 1 :(得分:3)

A* a = new A[5]; 

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

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个对象:)

答案 2 :(得分: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

答案 3 :(得分: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)个字节的内存并调用了A的默认构造函数的5倍(没有任何参数的构造函数),但是这个默认构造函数在类A中不可用。

答案 4 :(得分:0)

这里的问题是你没有默认的构造函数。当你打电话给新的时,它需要以某种方式创建对象,而且不能。你必须提供一个(即一个用零初始化xy)或者如果C ++ 11是一个选项则使用initializer list

答案 5 :(得分:0)

如果您不想定义默认构造函数,请尝试使用

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