给定一个玩具struct
,其默认构造函数如下:
struct RGB {
unsigned char r, g, b;
RGB()
:r(0), g(0), b(0) {}
};
如果我没有访问源代码来添加我自己的构造函数,我如何将其初始化为特定颜色。
我完全不明白为什么这些不起作用:
// OK, I can sort-of accept this one
RGB red = {255, 0, 0};
// Not shorthand for green.r=0, green.g=255, green.b=0;?
RGB green = {.r = 0, .g = 255, .b = 0};
// I seem to be missing a constructor that accepts a list?
RGB blue{0, 0, 255};
是否还有其他C ++ 11方法可以缩短老式的优点:
RGB yellow;
yellow.r = 255;
yellow.g = 255;
yellow.b = 0;
此外,我如何最低限度地修改struct
声明以支持上述任何声明,以及使用默认初始化方法。
答案 0 :(得分:2)
如果你不可能在struct的构造函数中添加默认参数,那么辅助函数如何:
RGB makeRGB(unsigned char r, unsigned char g, unsigned char b)
{
RGB result;
result.r = r;
result.g = g;
result.b = b;
return result;
}
可以这样使用:
RGB red = makeRGB(255, 0, 0);
Return value optimization将处理临时问题并提供无开销解决方案,除非您使用可怕的编译器。
理想的解决方案是修改默认构造函数以获取可选参数:
struct RGB {
unsigned char r, g, b;
explicit RGB(unsigned char r, unsigned char g, unsigned char b)
:r(r), g(g), b(b) {}
RGB() : RGB(0, 0, 0) {}
};
可以像您期望的那样使用:
RGB red(255, 0, 0);
RGB green{0, 255, 0};
RGB blue;
blue.b = 255;
答案 1 :(得分:0)
鉴于
struct color
{
color(std::initializer_list<float> list) = delete;
float r, g, b;
};
color c = {1,2,3}
和color c {1,2,3}
相同。color c = {.r = 0, .g = 255, .b = 0};
在C ++ 11中完全没问题。它被称为aggregate initialization。它甚至会覆盖color c = {1,2,3};
的显式构造函数。链接描述了如何明确删除它。initializer_list
initializer_list
中的构造函数
醇>