STL中经常使用容器。按照《C++ primer》的说法,容器里面是不可以放置I/O对象的,原因是I/O对象不支持复制和赋值。
这是因为我们把元素放置到容器中,实际上放置的是元素的副本。所以这个存放的过程中就存在了一个副本生成的过程。对于简单数据类型,直接进行复制就可以了。而对于一些类类型的数据,就要考察这个类是否支持这种复制了。特别需要注意的就是,一些含有指针成员的类如果要放置到容器中,最好最好为他重载复制构造函数,以便进行深度复制。下面的例子:
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
int a;
int *p;
A(int a){
this->a = a;
p = new int;
*p = a;
}
void show(){
cout << "a:" << a << endl;
cout << "*p:" << *p << endl;
}
void setA(int a){
this->a = a;
}
//复制构造函数
A(const A &a){
p = new int;
*p = *(a.p);
}
~A(){
delete p;
}
};
void main(){
vector<A> vec;
A *p = new A(23);
p->show();
vec.push_back(*p);
vec.at(0).setA(12);
vec.at(0).show();
delete p;
vec.at(0).setA(12);
vec.at(0).show();
}
如果不显示的给出复制构造函数,程序会抛出运行时错误。
这是我们使用容器时需要关注的问题。