[英]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.