示例:
class Shape
{
public:
virtual void draw() = 0;
virtual void erase() = 0;
Shape() {}
virtual ~Shape() {}
};
class Circle :public Shape
{
public:
Circle() {}
void draw() { cout << "Circle draw" << endl; }
void erase() { cout << "Circle erase" << endl; }
~Circle() {}
};
class Square :public Shape
{
public:
Square() {}
void draw() { cout << "Square draw" << endl; }
void erase() { cout << "Square erase" << endl; }
~Square() {}
};
必须使用Shape,因为只有基类的指针或引用才可以访问派生类的成员*
int main()
{ //必须使用Shape*,因为只有基类的指针或引用才可以访问派生类的成员
std::vector<Shape*> shapevec;//vector的对象(未初始化)
string name; //first,last,end均指向空
while (cin >> name, name != "end")
{
if (name == "Circle")
{ //将Circle的对象让(Shape*)类型指针所指。
shapevec.push_back(new Circle());
}
if (name == "Square")
{
shapevec.push_back(new Square());
}
else
{
cout << "input shape name error" << endl;
}
for (auto& x : shapevec)//推演 x 是shape*&,x是shape*的引用
{
x->draw();
x->erase();
}
for (auto x : shapevec)//推演 x 是shape*
{
x->draw();
x->erase();
}
}
}
vector<int> iar;
iar.reserve(100)//只是进行简单的扩容
vector<int> iar;
iar.resize(100);//扩容完,还要对空间进行初始化
)
vector<Object*>objar;和vectorvec;的区别
obj.push_back(Object(10));
objar.push_back(new Object(10));
vector<Object*>objar;
vector<Object>vec;
obj.push_back(Object(10)); //是将Object的对象放入vector的容器空间,所以在释放vector的空间的时候,需要析构空间中的对象。
objar.push_back(new Object(10));//objar指向object对象的地址,因此释放空间只是将vector中的指针释放,并不能释放指针所指的对象。
3.emplace_back
vector<Object*>objar;
vector<Object>vec;
objar.emplace_back(100); //vetor的空间是指针类型,指向100的地址
vec.emplace_back(100);//直接使用定位new,在vector的当前空间构建对象,并将100作为参数,传进去。
使用唯一性智能指针:
make_unique<>()
template<class T,class ...Arg>
std::unique<T> make_unique(Arg...arg)
{ //forward
return unique_ptr<T>(new T(arg));
} //调用unique构造函数,创建不具名对象,指向circle对象的地址,返回这个unique_ptr的不具名对象.
//将unique_ptr的对象存放在vector的空间中。(unique_ptr的对象中的指针指向了Circle对象的地址)
shape.push_back(std::make_unique<Circle>());
//等同于:std::unique_ptr<Shape>(new Circle());
如下图:
5. shapevec.emplace_back(new Circle());
std::vector<std::unique_ptr<Shape> > shapevec;
shapevec.emplace_back(new Circle());
6. 如果使用 for (auto x : shapevec)是错误的,因为使用x,需要调用拷贝构造函数,将unique_ptr
拷贝给x,但是unique_ptr没有拷贝构造函数。
用到智能指针:可以自动化析构对象,和释放资源。
int main()
{
std::vector<std::unique_ptr<Shape> > shapevec;//vector的对象(未初始化) //first,last,end均指向空
string name;
while (cin >> name, name != "end")
{
if (name == "Circle")
{
//shapevec.push_back(std::make_unique<Circle>());
shapevec.emplace_back(new Circle());//将Circle无名对象的地址拷贝给shapevec,
//shapevec中的Shape类型的指针指向Circle的地址。
}
else if (name == "Square")
{
//shapevec.push_back(std::make_unique<Square>());
shapevec.push_back(std::unique_ptr<Shape>(new Circle));
}
else
{
cout << "input shape name error" << endl;
}
}
//如果使用 for (auto x : shapevec)是错误的,因为使用x,需要调用拷贝构造函数,将unique_ptr
//拷贝给x,但是unique_ptr没有拷贝构造函数。
for (auto& x : shapevec)
{
x->draw();
x->erase();
}
}