[英]C++ Copy an object through constructor
通過將其他對象復制到新類中,我遇到了一些問題。 據我所知,下面的代碼可以正常工作,但是我的編譯器指出它缺少類材料的默認構造函數。 從我可以看到,這是不需要的。 我在這里做錯什么了嗎?
一流的構造函數:
shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial){
dataFormat_ = layout;
batchMaterial_ = *(new material(batchMaterial));
}
我也嘗試過
shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial){
dataFormat_ = layout;
batchMaterial_ = batchMaterial;
}
但是返回相同的編譯器錯誤。
二級定義
class material {
protected:
shader shader_;
public:
material (const shader* shaderProgram);
material (const material&);
~material();
void compileShader();
} ;
第二類副本構造函數
material::material(const material& other){
shader_ = *(new shader(other.shader_));
}
編輯:根據要求,
頭等艙的定義
class shadingBatch {
friend class cheeseRenderer;
protected:
std::vector<primitive*> primitives_;
std::vector<vertex> vertices_;
std::vector<GLuint> elements_;
vertexAttribLayout dataFormat_;
material batchMaterial_;
GLuint VAO_;
GLuint VBO_;
GLuint EBO_;
public:
~shadingBatch();
GLuint updateBatch (void);
void addPrimitive (primitive*);
shadingBatch(const vertexAttribLayout&, const material&);
private:
void updatePrimitives (void);
void setVertexAttributes(void);
} ;
並在其中調用構造函數:
shader* defaultShader = new shader(fragmentSource,vertexSource);
material* defaultMaterial = new material(defaultShader);
vertexAttribLayout* defaultVertexData = new vertexAttribLayout();
shadingBatch* batch = new shadingBatch(*defaultVertexData,*defaultMaterial);
cheeseRenderer renderer(*batch);
首先,您應該使用初始化列表。 未在初始化列表中顯式初始化的任何成員變量對象將在執行構造函數主體之前調用其默認構造函數。 然后,您還要執行新操作,但不要刪除它(因為會丟失指針),因此構造函數會泄漏內存。 嘗試這個:
shadingBatch::shadingBatch(const vertexAttribLayout& layout,
const material& batchMaterial) :
dataFormat_(layout)
,batchMaterial_(batchMaterial)
{
}
上述假定兩個dataFormat_
和batchMaterial_
是類的成員變量shadingBatch
,他們在類定義的順序聲明的,因此修復需要,如果事實並非如此。
您的material::material
也同時存在內存泄漏和默認構造函數問題,因此您需要執行以下操作:
material::material(const material& other) : shader_(other.shader_) {}
(如果還有更多要做的話,可能還有更多的初始化代碼,但是您明白了。)
您要做的不是構造對象,而是在構造完參數后將參數復制到內部對象中。 您想查找初始化列表的概念。 您要實現的構造函數如下所示:
shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial)
: dataFormat_(layout), batchMaterial_(batchMaterial) // <-- initialization list
{}
如果您沒有在初始化列表中顯式初始化類成員,則將默認構造它們。 至少,編譯器會嘗試。 Material似乎沒有默認的構造函數,因此編譯器在兩次嘗試中均會抱怨。
旁注:第一次構造函數嘗試會發生另一個錯誤,即內存泄漏,因為您是通過new
創建對象的,並且既不存儲也不刪除結果指針,因此它的內存(以及對象本身)將永遠丟失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.