2011-12-10 53 views
0

我想學習C++和OpenGL的第一指針...回送一個專用陣列(編輯)

我想返回數組的第一個指針......但維修器材的const正確性.. 。

它發生:

class Foo{ 
    private: 
     GLubyte array[64][64][4]; 
    public: 
     const GLubyte& get_array(){return array;} 
    } 

給我這個編譯器錯誤:

:28: error: invalid initialization of reference of type 'const GLubyte&' from expression of type 'GLubyte (*)[64][4]' 

可以幫助米e瞭解如何返回 const正確性 第一個指針?

回答

1

它與const正確性無關。如果你想第一個指針......好吧,你需要返回一個指針:

const GLubyte* get_array(){return (GLubyte*)array;} 

演員工作,因爲數組在內存中連續表示。

但我相當確定你想要實現的更好的解決方案可以用std::vector而不是C風格的數組來設計。你究竟想要做什麼?

+0

什麼,我想將數組傳遞給OpenGL的功能,這可能是接近......所以std :: vector不是一個真正的選擇...或者我錯了嗎? – Pella86

+0

它比較厲害!謝謝!我認爲,當'返回數組'時,它總是給第一個指針的引用... – Pella86

+0

在這個答案中(在返回類型中)的'const'是可選的。從公共成員返回非const可能是糟糕的設計,但我只是在重申。 –

1

這與const正確性無關。你不能像GLubyte那樣返回一組GLubyte。如果您刪除了const&(除了錯誤消息當然不再包含const&),您將得到相同的錯誤消息。

編輯迴應你的編輯:如果你想返回一個參考到第一個元素,只需返回第一個元素:return array[0][0][0];。如果要將指針返回到第一個元素,請返回第一個元素的地址(return &array[0][0][0]),並將返回類型更改爲GLubyte*而不是GLubyte&

1

類型的arrayGLubyte * * *,所以你不能轉換爲參考,有寫

GLubyte const & get_array() const { return array[0][0][0]; } 

等你拿數組的第一個元素的引用。但是,如果你想要的指針,你必須改變你的代碼如下

GLubyte const * get_array() const { return &(array[0][0][0]); } 

如果你想要的東西爲你的C++代碼更好的,你可以看到也Boost.MultiArray

0

如果你是後某種多陣列封裝的話,我想你正在尋找

class Foo{ 
private: 
    std::vector<GLubyte> array; 
    size_t x_sz, y_sz, z_sz; 
public: 
    Foo(size_t x, size_t y=1, size_t z=1) 
    : array(x*y*z), 
     x_sz(x), y_sz(y), z_sz(z) 
    {} 

    const GLubyte& element_at(size_t x, size_t y=0, size_t z=0) const 
    { 
     return array.at(z*y_sz*x_sz+y*x_sz+x); 
    } 

    GLubyte& element_at(size_t x, size_t y=0, size_t z=0) 
    { 
     return array.at(z*y_sz*x_sz+y*x_sz+x); 
    } 

    GLubyte *data()   //returns array 
    { 
     return &vector[0]; 
    } 

    const GLubyte *data() const //returns const array 
    { 
     return &vector[0]; 
    } 
};