我试图在使用矢量之前设置大小,但得到错误信息:
错误 c2512: 'EItem:EItem' : 没有合适的默认构造函数可用
// file.h
vector<EItem > *eL;
// file.cpp
eL = new vector<EItem>(100);
我需要在自己定义的对象中提供EItem
什么?
我试图在使用矢量之前设置大小,但得到错误信息:
错误 c2512: 'EItem:EItem' : 没有合适的默认构造函数可用
// file.h
vector<EItem > *eL;
// file.cpp
eL = new vector<EItem>(100);
我需要在自己定义的对象中提供EItem
什么?
正如您的编译器所说,您必须为您的EItem
类定义一个默认构造函数:
在 .h 中:
class EItem {
public:
EItem(); // constructor
// ...
};
在 .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 个元素初始化向量,这些元素填充了我们类型的默认构造值。在上述情况下,如果类没有默认构造函数是错误的。
这个线程也有一些很好的答案:我们什么时候需要一个默认构造函数?
编译器将您指向正确的方向:您的类 EItem 没有默认构造函数- 因此您应该提供一个。
从这里引用:
如果我们不声明默认构造函数然后实例化我们的类会发生什么?答案是 C++ 将为我们的类实例分配空间,但不会初始化类的成员(类似于声明 int、double 或其他基本数据类型时发生的情况)。
在不知道EItem
类的定义的情况下,实现默认构造函数的最小示例是:
class EItem {
...
public:
...
//this is a minimal default constructor
EItem() {
...
//initialize and set the values for any data members of the class here
...
}
...
}
有关此内容的更多信息以及更重要的是为什么您应该始终在课堂上提供一个,请参阅以下内容:
向量需要知道 EItem 占用了多少大小,因为向量使用数组。如果 EItem 类中不存在其他构造函数,则将提供默认构造函数。确保您定义了类并且构造函数是公共的。
class EItem
{
public:
EItem();
};
您的类需要有一个不带参数的默认构造函数才能使用这样的向量。如果您没有默认构造函数,那么您需要创建一个指向您的类的指针向量。