2013-02-05 41 views
0

通過複製其他對象來創建新類時遇到了一些問題。從我可以看到,下面的代碼工作,但是我的編譯器指出它缺少類材料的默認構造函數。從我所看到的情況來看,這不是必需的。我在這裏做錯了什麼?C++通過構造函數複製對象

第一類的構造函數:

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); 
+0

請添加錯誤信息。當你錯過一個默認的構造函數時,你的編譯器的真實時間爲99.999999%。通常,一個類將缺少的默認構造函數類作爲成員,並且不會在類中正確初始化該成員。 –

+0

你能告訴我們'shadingBatch'的定義和它的構造函數的調用嗎? –

+3

除非你真的需要,否則不要使用'new',並且你知道你在做什麼。目前,這只是造成麻煩和資源泄漏。 – juanchopanza

回答

1

你在做什麼不是構造對象,而是將它們的參數複製到內部對象後面它們已經被構建。你想查看初始化列表的概念。要實現這樣看起來構造:

shadingBatch::shadingBatch(const vertexAttribLayout& layout, const material& batchMaterial) 
    : dataFormat_(layout), batchMaterial_(batchMaterial) // <-- initialization list 
{} 

如果你不類成員明確在初始化列表初始化,它們將被默認的構造。或者至少,編譯器會嘗試。材料似乎沒有默認的構造函數,所以編譯器會在你的嘗試中抱怨。

旁註:第一個構造函數嘗試有另一個錯誤,內存泄漏,因爲你通過new創建一個對象,既不存儲也不刪除結果指針,它的內存(和對象本身)將永遠丟失。

4

首先,你應該使用初始化列表。在初始化程序列表中未明確初始化的任何成員變量對象將具有構造函數體執行前調用的默認構造函數。然後你也做新的,但不要刪除它(因爲你失去了指針),所以你的構造函數泄漏內存。試試這個:

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_) {} 

(如果還有更多的事情要做,但你的想法可能更多的初始化代碼)