【问题标题】:Initialise public members of a struct with a default constructor使用默认构造函数初始化结构的公共成员
【发布时间】:2016-07-20 07:22:35
【问题描述】:

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

【问题讨论】:

    标签: c++11 initialization


    【解决方案1】:

    如果你无法为结构的构造函数添加默认参数,那么辅助函数怎么样:

    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.

    【讨论】:

    • “理想解决方案”并不那么理想 - 它定义了从 unsigned charRGB 的隐式转换。
    • 谢谢,我可能想多了这个问题。我应该向生成有问题的标头的项目提交错误报告/更改请求,以查看它们是否可以制作对初始化更友好的构造函数。
    【解决方案2】:

    给定

    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. color c = {.r = 0, .g = 255, .b = 0}; 之类的语法特定于 C 编程语言,而不是 C++。
    3. color c = {1,2,3}; 在 C++11 中非常好。它被称为aggregate initialization。它甚至会覆盖来自initializer_list 的显式构造函数。链接描述了如何显式删除它。
    4. initializer_list 的构造函数可以被color c({1,2,3}) 显式调用

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2016-04-05
      • 1970-01-01
      • 2015-07-03
      • 2015-10-07
      相关资源
      最近更新 更多