我有一个类,它声明了char
类型的向量向量,如下所示,并包含一个读取其中一半并返回结果向量的方法。
class Mapa
{
private:
vector<vector<char> > vec;
public:
//Constructor
Mapa():vec(0,vector<char>(0)){};
Mapa(int row, int col):vec(row, vector<char>(col)){};
virtual ~Mapa(){};
}
const Mapa& just_Half()
{
Mapa temp(vec.size(),vec[0].size());
int a = vec.size()*vec[0].size()/2;
for (int i = 0; i < vec.size() && a>0; i++, a--)
for (int j = 0; j < vec[i].size() && a>0; j++, a--){
temp.vec[i][j]=vec[i][j];
}
return temp;
}
我主要做的是:
Mapa Mapa1(3, 10);
Mapa Mapa2;
Mapa2=Mapa1.just_Half();
我的问题是为什么Map2只是和空矢量在这结束? 为什么不接受临时?
感谢您的帮助。
答案 0 :(得分:2)
问题是您的返回类型是对Mapa
的引用。当函数超出范围时,您返回的Mapa
(函数内部名为temp
)将被破坏,因此您将返回一个未定义的被破坏的Mapa
。
解决方案很简单,按值而不是按引用返回:
const Mapa just_Half()
{
Mapa temp(vec.size(),vec[0].size());
int a = vec.size()*vec[0].size()/2;
for (int i = 0; i < vec.size() && a>0; i++, a--)
for (int j = 0; j < vec[i].size() && a>0; j++, a--){
temp.vec[i][j]=vec[i][j];
}
return temp;
}
如果您担心这会造成不必要的副本,请不要担心。编译器几乎总是使用return value optimization来优化复制操作。