复制C ++中没有默认构造函数的成员的构造函数

时间:2014-03-11 23:09:17

标签: c++ constructor copy-constructor deep-copy default-constructor

我有一个班级:

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

3 个答案:

答案 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实例被破坏时,你不必担心破坏子集。