代码之家  ›  专栏  ›  技术社区  ›  mpen

带有引用的构造函数没有正确分配?

  •  2
  • mpen  · 技术社区  · 16 年前

    我想写一个简单的颜色类,它应该是尽可能多的。它看起来是这样的:

    class MyColor {
    private:
    uint8 v[4];
    public:
    uint8 &r, &g, &b, &a;
    
    MyColor() : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {}
    MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {
        printf("%d, %d, %d, %d\n", red, green, blue, alpha);
        r = red;
        g = green;
        b = blue;
        a = alpha;
    }
    MyColor(uint8 vec[]) : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {
        MyColor(vec[0], vec[1], vec[2], vec[3]);
    }
    uint8 operator [](int i) {
        return v[i];
    }
    operator const GLubyte*() {
        return v;
    }
    };
    

    下面是我正在尝试的代码:

    uint8 tmp[] = {1,2,3,4};
    MyColor c(tmp);
    printf("%d, %d, %d, %d\n", c.r, c.g, c.b, c.a);
    

    (如果我能做到的话,我会喜欢的 MyColor c = {1,2,3,4} 但我不确定这在当前的规范中是可能的?)

    无论如何,它输出:

    1, 2, 3, 4
    112, 22, 104, 89
    

    所以它在第二个构造函数中得到的值是正确的,但是当它返回时…这些值是随机的?是吗?

    r = red 应同时设置 r v[0] red 不是吗?自从 R 只是一个参考 V〔0〕 它们实际上有相同的价值,不是吗?我不是在做一些奇怪的重新分配空间中某个地方的参考,是吗?

    2 回复  |  直到 16 年前
        1
  •  4
  •   CB Bailey    16 年前

    不幸的是,目前无法在C++中做构造函数转发。问题是:

    MyColor(uint8 vec[]) : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {
        MyColor(vec[0], vec[1], vec[2], vec[3]);
    }
    

    这实际上是将引用绑定到成员向量 v 然后在构造函数的主体中创建一个临时的mycolor值,然后将其丢弃。

    输出的第二行是打印成员向量的垃圾初始值 V 已构建的mycolor。

    我建议将构造函数的赋值部分分解为4 uint8 并从两个构造函数调用它。

    void AssignColorValues( uint8 red, uint8 green, uint8 blue, uint8 alpha)
    {
        printf("%d, %d, %d, %d\n", red, green, blue, alpha);
        r = red;
        g = green;
        b = blue;
        a = alpha;
    }
    
    MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]),  g(v[1]),     b(v[2]), a(v[3])
    {
        AssignColorValues( red, green, blue, alpha );
    }
    
    MyColor(uint8 vec[]) : r(v[0]),  g(v[1]), b(v[2]), a(v[3])
    {
        AssignColorValues(vec[0], vec[1], vec[2], vec[3]);
    }
    
        2
  •  0
  •   keraba    16 年前

    事实上,我相信你今天可以做到大部分。可以从常量表达式初始化数组,因此您也应该能够初始化。不过,我相信您将不得不摆脱其他构造函数。如果这有帮助,您可以保留分配运算符。