使用默认构造函数初始化结构的公共成员

时间:2016-07-20 07:22:36

标签: c++11 initialization

给定一个玩具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声明以支持上述任何声明,以及使用默认初始化方法。

2 个答案:

答案 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;

Live demo here

答案 1 :(得分:0)

鉴于

struct color
{
color(std::initializer_list<float> list) = delete;
float r, g, b;
};
  1. color c = {1,2,3}color c {1,2,3}相同。
  2. 像<{1}}这样的语法特定于C编程语言,而不是C ++。
  3. color c = {.r = 0, .g = 255, .b = 0};在C ++ 11中完全没问题。它被称为aggregate initialization。它甚至会覆盖color c = {1,2,3};的显式构造函数。链接描述了如何明确删除它。
  4. initializer_list
  5. 可以明确调用initializer_list中的构造函数