2011-08-30 126 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); 

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