我在尝试使用vector之前设置大小,但得到了错误信息:
错误c2512:'EItem:EItem':没有合适的默认构造函数
// file.h
vector<EItem > *eL;
// file.cpp
eL = new vector<EItem>(100);
我需要在自己定义的对象EItem
中提供什么?
答案 0 :(得分:2)
正如您的编译器所说,您必须为EItem
类定义默认构造函数:
在.h:
class EItem {
public:
EItem(); // constructor
// ...
};
in .cpp:
EItem::EItem() {}
或者一个人(在.h中):
class EItem {
public:
EItem() {} // constructor
// ...
};
这是最低限度。您可以向类中添加一些参数,并在构造函数中初始化类的某些属性。
在C ++中,默认构造函数很重要,因为它们在某些情况下会自动调用:
- 当声明一个没有参数列表的对象值时,例如
MyClass x;
或动态分配,不带参数列表,例如new MyClass
或new MyClass();
默认构造函数用于初始化对象- 当声明一个对象数组时,例如
MyClass x[10];
或动态分配,例如new MyClass [10];
默认构造函数用于初始化所有元素- 当派生类构造函数未在其初始化列表中显式调用基类构造函数时,将调用基类的默认构造函数
- 当类构造函数没有在其初始化列表中显式调用其某个对象值字段的构造函数时,该字段类的默认构造函数被称为
- 在标准库中,当未明确给出值时,某些容器使用默认构造函数“填充”值(例如:
vector<MyClass>(10);
),使用10个元素初始化向量,这些元素用我们类型的默认构造值。在上述情况下,如果该类没有默认构造函数,则会出错。
这个帖子也有一些很好的答案:When do we need to have a default constructor?
答案 1 :(得分:1)
编译器指向正确的方向:类EItem没有默认构造函数 - 因此您应该提供一个。
引自here:
如果我们不声明默认构造函数然后会发生什么 实例化我们的课程?答案是C ++将为其分配空间 我们的类实例,但不会初始化类的成员 (类似于声明int,double或other时发生的情况 基本数据类型)。
在不知道EItem
类的定义的情况下,实现默认构造函数的最小示例是:
class EItem {
...
public:
...
//this is a minimal default constructor
EItem() {
...
//initialize and set the values for any data members of the class here
...
}
...
}
有关此内容的更多信息,更重要的是为什么,您应该始终在课程中提供一个,请参阅以下内容:
答案 2 :(得分:1)
向量需要知道EItem占用多少大小,因为向量使用数组。如果EItem类中不存在其他构造函数,则将提供默认构造函数。确保定义了类,构造函数是公共的。
class EItem
{
public:
EItem();
};
答案 3 :(得分:0)
你的类需要一个没有参数的默认构造函数,以便能够使用这样的向量。如果你不能有一个默认的构造函数,那么你需要创建一个指向你的类的指针向量。