2014-06-16 53 views
2

我寫使用OpenGL一類新的另一個構造C++的構造函數調用,我有我的構造兩種可能性:從數組初始化

VertexObject(); 
VertexObject(GLuint* vertices,GLuint* elements); 

什麼,我想這樣做是VertexObject()調用其他一個已經inisialised陣列如

VertexObject::VertexObject() : 
    VertexObject( 
    (GLuint[]) { 
     0, 1, 2, 
     2, 3, 0 
    }, 
    (GLuint[]) { 
     0, 1, 2, 
     2, 3, 0 
    }) {} 

但它似乎C++不會讓我這樣做,錯誤是'採取臨時陣列的地址'。 我甚至不確定我要求什麼是可行的,但任何幫助將不勝感激。

+0

不應該把'vertices'和'elements'指向''const'指針嗎? – Simple

+0

@Simple由於非常規,我認爲解決方案有點複雜 - 請參閱我的回答 – ikh

回答

1

如果深拷貝構造函數中的數組,或者如果陣列從來沒有修改,VertexObject不採取指針的所有權,這應該工作:

GLuint def_vert[6] = { // static storage 
    0, 1, 2, 
    2, 3, 0 
}; 
VertexObject::VertexObject() : 
VertexObject(def_vert, def_vert) {} 

您可以使用,如果獨立數組當然你需要爲每個參數設置不同的值。

+0

呵呵我不知道爲什麼我沒有想到這一點,我已經將它用於default_shaders,非常感謝它解決了它^^ – aze

+0

它可能是錯的 - 構造函數的參數不是'const GLuint *' ,但'GLuint *',所以'def_vert'可以改變。看到我的答案。 – ikh

+1

@ikh:是的,如果構造函數不修改數組,那麼爲了const正確性,參數應聲明爲「const」。在這種情況下'def_vert'也可以是'const'。 – user2079303

2

我建議你看看boost庫,特別是指定模式(有利於容器的初始化)可能有所幫助。

這裏是一個小的代碼段可能會給你掌握的想法:

VertexObjectc(boost::assign::list_of(0)(1)(2)(2)(3)(0).convert_to_container<GLuint>()); 

我haven`t進行了測試。

+0

好的讓我試試這個,我會讓你知道結果。 – aze

+0

另一個答案解決了我的問題,但boost庫實際上觸發了另一個錯誤:無法從int轉換爲其他類型。我真的沒有時間去完全理解它,但現在我知道Boos看起來像一個好的圖書館。非常感謝您的幫助。 – aze

+0

@ user3714670歡迎您。提升值得研究(至少部分),它提供了很多很棒的功能。 –

0

試試這個:

// VertexObject.h 
class VertexObject 
{ 
private: 
    static const GLuint m_default_vertices[6], m_default_elements[6]; 
    static GLuint *GetDefVertices(); 
    static GLuint *GetDefElements(); 
public: 
    VertexObject() : VertexObject(GetDefVertices(), GetDefElements()) { } 
    ... 
}; 
// VertexObject.cpp 
const GLuint VertexObject::m_default_vertices[6] = { 
    0, 1, 2, 
    2, 3, 0 
}; 
const GLuint VertexObject::m_default_elements[6] = { 
    0, 1, 2, 
    2, 3, 0 
}; 
GLuint *VertexObject::GetDefVertices() 
{ 
    static thread_local GLuint ar[6]; 
    memcpy(ar, m_default_vertices, sizeof(ar)); 
    return ar; 
} 
GLuint *VertexObject::GetDefElements() 
{ 
    static thread_local GLuint ar[6]; 
    memcpy(ar, m_default_elements, sizeof(ar)); 
    return ar; 
} 

http://ideone.com/IvujSq

注意,它適用於C++ 11。