vector中存放自定义类的前提是:
自定义的类必须有默认构造函数。因为vector会调用默认构造函数来初始化元素的对象。
那必须要明确:编译器什么时候隐式声明默认构造函数?
有两个条件:
· 该类没有显式声明任何构造函数。--既然你都定义了,系统就不给你生成了。
· 数据成员中没有const和reference。--因为要初始化。
满足则隐式生成默认构造函数。这里强调“任何”,是指即使用户自定义了复制构造函数或一个需要多个参数的构造函数,默认构造函数也不会被隐式声明了。在定义一个类时要保证有默认的构造函数。
没有默认构造函数,系统会报错:
#include<map>
#include<sstream>
using namespace std;
class myInt
{
public:
myInt(int a ,int b):m_li(a),m_ri(b)
{}
void print()
{
std::cout<<"m_li = "<<this->m_li<<std::endl;
std::cout<<"m_ri = "<<this->m_ri<<std::endl;
}
void set(int li, int ri)
{
this->m_li = li;
this->m_ri = ri;
}
private:
int m_li;
int m_ri;
};
int main() {
std::vector<myInt> v1(30);
for(std::vector<myInt>::iterator iter = v1.begin(); iter != v1.end(); iter++)
{
iter->print();
}
return 0;
}
报错信息:error C2512: “myInt”: 没有合适的默认构造函数可用。
分析:myInt(int a ,int b):m_li(a),m_ri(b) 该类定义了构造函数,编译器就不会定义默认构造函数,所以,就会报错。
正确的做法:
class myInt
{
public:
myInt(int a ,int b):m_li(a),m_ri(b)
{}
myInt():m_li(0),m_ri(0)
{}
void print()
{
std::cout<<"m_li = "<<this->m_li<<std::endl;
std::cout<<"m_ri = "<<this->m_ri<<std::endl;
}
void set(int li, int ri)
{
this->m_li = li;
this->m_ri = ri;
}
private:
int m_li;
int m_ri;
};
int main() {
std::vector<myInt> v1(30);
for(std::vector<myInt>::iterator iter = v1.begin(); iter != v1.end(); iter++)
{
iter->print();
}
return 0;
}