簡體   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