[英]Replace default copy constructor with copy constructor for base class (c++)
[英]Copy constructor for class that has member without default constructor in C++
我有一堂课:
class Geometry{
std::vector<Subset *> subsets;
int verticesCount;
...
};
我想补充一个拷贝构造函数,所以我可以使对象的深层副本 (与自己的subsets
, 不仅自己的指向相同subsets
)。
我已经试过了:
Geometry & Geometry::operator=(const Geometry &other){
verticesCount = other.verticesCount;
Subset * subset = 0;
for(unsigned int i=0; i<other.subsets.size(); i++){
subset = new Subset();
subsets.push_back(subset);
}
...
return *this;
}
问题是Subset
没有默认的构造函数,因此在subset = new Subset()
出错。
我还有更多没有默认构造函数的成员。
如何解决这个问题?
我宁愿不为所有成员( Subset
等) 添加默认构造函数 。最好的解决方案是根本不更改成员类( Subset
等),但是如有必要,我可以向其添加一些东西。
由于 Model3D
安全性等原因 ,它们没有默认的构造函数(我不想让某人在不提供文件名的情况下创建Model3D
类(因此可以创建顶点缓冲区,并且我可以假定所有Model3D
对象都具有非空文件名关联) )。
编辑:
由于评论。 Subset
是没有默认构造函数的成员类的示例。
在这种情况下,这是我自己的课:
class Subset{
...
public:
Subset(bool useLineTopology, int vertexIndexStart, int vertexIndexAmmount = -1);
...
};
但是我还有许多其他成员没有默认构造函数,例如DirectX的ID3D11Buffer * constantBuffer
。
如果您的Subset()
类具有副本构造函数,则可以执行以下操作:
std::vector<Subset *>::const_iterator it ; // use iterators
for ( it = other.subsets.begin() ; it != other.subsets.end() ; ++it )
subset.push_back( new Subset( *it )) ; // add a copy of original subset.
如果您的Subset()
没有复制构造函数,则无法复制。
另外,您需要记住拥有~GeometryStructure()
才能从subset std::vector
删除所有Subset()
对象。
您正在制作深层副本,因此循环应如下所示
for(unsigned int i=0; i<other.subsets.size(); i++){
subsets.push_back(new Subset(other.subsets[i]));
}
也就是说,您需要元素的副本构造函数 。 即使Subset
具有默认的构造函数,您也不会用它复制任何内容。
关于什么:
class Geometry{
std::vector<Subset> subsets;
int verticesCount;
...
};
如果您将复制和/或语义转移到Subset类,则不需要创建构造函数,因为编译器将负责调用Subset复制构造函数等。 其他好处是,在销毁Geometry实例时,您无需担心销毁子集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.