4

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

我想创建一个包含五个类对象的动态数组,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);
    }
}

有人可以告诉我这样做的正确语法是什么,因为我没有简单的构造函数?

4

6 回答 6

7

这条线

A* a = new A[5];

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

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

请注意,在 C++ 中,通常倾向于std::vector<A>在这种情况下使用 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));
}
于 2013-03-15T12:27:48.863 回答
3
A* a = new A[5]; 

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

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

于 2013-03-15T12:35:09.127 回答
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

于 2013-03-15T12:29:32.343 回答
0

你有两个选择:

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

  • 或者包含一个默认构造函数A(): x(0), y(0) {},或者只是将默认参数添加到您现有的构造函数中。

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

于 2013-03-15T12:29:31.770 回答
0

这里的问题是您没有默认构造函数。当您调用 new 时,它需要以某种方式创建对象,而不能。如果 C++11 是一个选项,您必须提供一个(即初始化xy零)或使用初始化列表。

于 2013-03-15T12:29:48.293 回答
0

如果您不想定义默认构造函数,那么试试这个,

int main() 
{    
    A* a[5];
    for(int i=0;i<5;i++) {
      a[i] = new A(i, 10);
    }
}
于 2013-03-15T12:35:36.870 回答