我有一个班级:
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
等。)最好的解决方案是 NOT 来更改成员类(Subset
等),但如果有必要,我可以向他们添加一些东西。
他们没有原因的默认构造函数,例如安全性(我不想让某人在没有提供文件名的情况下创建Model3D
类(因此可以创建顶点缓冲区,我可以假设所有Model3D
个对象都没有关联的空文件名)。 / p>
编辑:
由于评论。 Subset
是没有默认构造函数的成员类的示例。
在这种情况下,这是我自己的课程:
class Subset{
...
public:
Subset(bool useLineTopology, int vertexIndexStart, int vertexIndexAmmount = -1);
...
};
但我还有很多其他成员没有默认构造函数,比如DirectX的ID3D11Buffer * constantBuffer
。
答案 0 :(得分:3)
如果您的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()
subset std::vector
个对象
答案 1 :(得分:1)
你正在进行深层复制,所以你的循环看起来应该是
for(unsigned int i=0; i<other.subsets.size(); i++){
subsets.push_back(new Subset(other.subsets[i]));
}
也就是说,元素需要复制构造函数。即使Subset
有一个默认的构造函数,你也不会用它复制任何东西。
答案 2 :(得分:1)
怎么样:
class Geometry{
std::vector<Subset> subsets;
int verticesCount;
...
};
如果对Subset类实现复制和/或移动语义,则不需要创建构造函数,因为编译器将负责调用Subset复制构造函数等。其他有利的一点是,当你的Geometry实例被破坏时,你不必担心破坏子集。