我有一种困惑。以下是代码段。
我想使用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);
}
}
有人可以告诉我,为什么我没有一个简单的构造函数来执行此操作的正确语法?
答案 0 :(得分:7)
这一行
A* a = new A[5];
要求A
是默认可构造的。因此,一个简单的选择是将默认构造函数添加到A
:
A(): x(), y() {} // zero-initializes x and y
请注意,在C ++中,人们通常倾向于在这种情况下使用std::vector<A>
。它需要所有内存管理,因此没有必要明确调用new
和delete
。它也可以动态调整大小。这将构造一个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)
这里的问题是你没有默认的构造函数。当你打电话给新的时,它需要以某种方式创建对象,而且不能。你必须提供一个(即一个用零初始化x
和y
)或者如果C ++ 11是一个选项则使用initializer list。
答案 5 :(得分:0)
如果您不想定义默认构造函数,请尝试使用
int main()
{
A* a[5];
for(int i=0;i<5;i++) {
a[i] = new A(i, 10);
}
}