繁体   English   中英

复制具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM