我有以下功能:
void getDefaultMaterial(Uint8 rgb[3]);
问题是我希望rgb
参数具有默认值。像那样:
void getDefaultMaterial(Uint8 rgb[3]={255, 255, 255});
不幸的是,编译器不喜欢这个?还有另一种方式吗?
答案 0 :(得分:7)
请注意,参数是指针,而不是数组 对于编译器,原型等同于
void getDefaultMaterial(Uint8* rgb);
重载是另一种选择:
void getDefaultMaterial(Uint8 rgb[3]);
void getDefaultMaterial()
{
Uint8 rgb[3] = { 255, 255, 255 };
getDefaultMaterial(rgb);
}
但是,如果rgb
是" out"参数,这一点让我望而却步。
如果它不是" out"参数,您可以使用具有默认值的实际数组,但您需要通过const引用传递它:
void getDefaultMaterial(const Uint8 (&rgb)[3] = {255, 255, 255});
或作为" out"带&#34的参数;默认为重载":
void getDefaultMaterial(Uint8 (&rgb)[3]);
void getDefaultMaterial()
{
Uint8 rgb[3] = { 255, 255, 255 };
getDefaultMaterial(rgb);
}
答案 1 :(得分:3)
或者使用std::array包装器作为参数:
void getDefaultMaterial(std::array<Uint8, 3> rgb = { { 255, 255, 255 } });
这将允许您使用braced-init-list作为默认参数值。请注意,仅C ++ 11标准需要 double 大括号。在C ++ 14及更高版本的标准中,您可以省略它们:
void getDefaultMaterial(std::array<Uint8, 3> rgb = { 255, 255, 255 });
答案 2 :(得分:2)
您可能不需要数组,因为它会衰减到函数参数中的指针。您可以简单地将其声明为指针并将其默认设置为nullptr
或您喜欢的任何内容,并在函数中标识默认地址。
例如:
void getDefaultMaterial(Uint8 *rgb = nullptr) {
static Uint8 defaultArg[3] = {255, 255, 255};
if (rgb == nullptr) {
rgb = defaultArg;
// Reset them if you need
}
// Your stuff
}
答案 3 :(得分:2)
您所讨论的“数组”是指针,而不是数组。使用实际数组(只能通过引用传递)可以正常工作。
void fun (const int (&a)[3] = {1,2,3}) {
std::cout << a[1];
}
当然,实际的正确方法是使用std::array
,它没有所有这些限制。