c ++引用作为私有变量的简写

时间:2016-07-24 14:45:47

标签: c++ reference

我习惯使用引用作为内部变量的简写,否则访问会更加麻烦,例如:

{ find . -depth -mindepth 1; find . -maxdepth 1 -depth -type f; }

这样,我可以这样做:

class Vec3
{
    double v[3];

public:

    // .x, .y and .z element access operators for convenience.
    double& x;
    double& y;
    double& z;

    Vec3() : x(v[0]), y(v[1]), z(v[2])
    {

    }
}

到目前为止一切都很完美。现在,碰巧这个Vec3类嵌套在另一个中。我想从更高级别直接访问Vec3.v [0],如下所示:

main
{
    Vec3 v;
    v.x = 1;
    v.y = 2;
    v.z = 3;
}

这样Node.x实际上就是Node.v.v [0],我可以这样做:

struct Node
{
    double &x;
    Vec3 v;
    Node() : v(Vec3()), x(v.x) {}
};

但遗憾的是没有。我应该看到的输出是

main
{
    Node n;
    n.v.x = 1;
    n.x = 2;
    std::cout << n.v.x << " " << n.x;
}

但我真正看到的是

2 2

如您所见,我试图将参考x指向 Node构造函数的初始化列表到Vec3的引用v.x,我甚至在之前显式初始化并调用了Vec3的构造函数。不过,n.x似乎还引用了其他内容。也许这样会起作用

1 2

但v.v是私有的,我真的希望它保持这种状态。

如何在不将v.v公开的情况下按照我的意图制作此作品?

1 个答案:

答案 0 :(得分:3)

问题出在Node结构上。类初始化顺序不依赖于cosntructor中指定的初始化顺序,而是依赖于变量声明的顺序。

你基本上用一些奇怪的,单元化的东西初始化double&,这是未定义的行为。

将声明的顺序更改为

struct Node
{
    Vec3 v;
    double &x;
    Node() : v(Vec3()), x(v.x) {}
};

你会没事的。