2011-08-30 175 views
2

可能重複:
Default values for array arguments設置默認參數爲數組

如何給出一個數組作爲默認參數的函數嗎?我試過這個:

void drawCircle(float radius, GLfloat colour[3]={2.0, 3.0, 4.0}, bool do=true) { 
... 
} 

部分GLfloat colour[3]={2.0, 3.0, 4.0}給我一個錯誤。這在C++中可能嗎?

+1

你永遠無法傳遞一個數組作爲參數。你通過什麼是指針開始。 –

+2

這是一個重複,但它不值得downvote。+1爲業障 –

回答

4

不能按值傳遞數組,所以你不能做到這一點。

所以解決辦法是,重載函數爲:

void drawCircle(float radius, GLfloat *colour, bool pleaseDo) 
{ 
    //... 
} 
void drawCircle(float radius, GLfloat *colour) 
{ 
    drawCircle(radius, colour, true); 
} 
void drawCircle(float radius) 
{ 
    GLfloat colour[3]={2.0, 3.0, 4.0}; 
    drawCircle(radius, colour, true); 
} 

drawCircle(a,b,c); //calls first function 
drawCircle(a,b); //calls second function 
drawCircle(a);  //calls third function 

第二和第三個功能最終調用第一功能!

另請注意,do是一個關鍵字,因此您不能將其用作變量名稱。我用pleaseDo代替它:D

+0

爲什麼'downvote'? – Nawaz

+0

pleaseDo?聽起來像[INTERCAL](http://en.m.wikipedia.org/wiki/INTERCAL)。 +1 –

+2

匿名downvotes是滋擾。我會取消這個,因爲你的回答是正確的。一件小事,由於OP特別關於數組大小3,所以我認爲你可以將第二個參數設置爲'GLfloat(&color)[3]';是不是 – iammilind

7

在C++中,您不能將一個完整的內存塊作爲參數傳遞給一個函數,但您可以傳遞它的地址。

所以不,你不能在C++ 03中至少做到這一點。

你可以這樣做:

GLfloat defaultColor[3] = {2.0, 3.0, 4.0}; 

void drawCircle(float radius, GLfloat colour[3]= defaultColor, bool do=true) 
{ 
} 
+0

defaultColor應該聲明爲一個GLfloat數組 –

+0

分配一個全局變量將不是線程安全的,並且全局數組大小應該是'3'(你錯誤地將它寫成'2') – iammilind

+0

'return 0;'爲void函數? – Nawaz

2

您可以將您的默認值定義爲全局變量。然後,使用這個全局變量作爲函數的默認參數。

GLfloat default_colour[3] = {2.0, 3.0, 4.0}; 

void drawCircle(float radius, GLfloat colour[3] = default_colour, bool doit = true) 
{ 
} 

順便說一句,do是一個關鍵字,你不能把它作爲一個參數名稱。

1

你不能完全做你想做的事,但這種解決方案適用於我的編譯器:

static GLFloat DefaultColour[]={2.0,3.0,4.0} 
void drawCircle(float radius, GLfloat colour[]=DefaultColour, bool do=true) { 
... 
} 
0

我認爲,從C++ 11的Initializer Lists功能可以在你的問題有所幫助。

void drawCircle(float radius, std::initializer_list<float> colors = {0.9f, 0.2f, 0.7f}, bool do=true) 
{ 

    if (colors.size() == 3) 
    { 
     // parse the values... 
    } 

... 
} 


// and then... 

drawCircle(10.0f); 

不幸的是我不知道,此功能在您的編譯器:(