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

c++ reference as shorthand to private variable

本文关键字:变量 引用 c++      更新时间:2023-10-16

我有一个习惯,就是使用引用作为内部变量的简写,否则访问起来会更麻烦,例如:

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])
    {
    }
}

通过这种方式,我可以例如这样做:

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

到目前为止,一切都很顺利。现在,恰好这个Vec3类嵌套在另一个类中。我想从更高级别直接访问Vec3.v[0],比如:

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

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

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

但不幸的是没有。我应该看到的输出是

2 2

但我真正看到的是

1 2

正如你所看到的,我正试图将参考x指向Node构造函数的初始化列表到Vec3的引用v.x,我甚至在之前显式地初始化和调用Vec3的构造函数。尽管如此,n.x似乎在引用其他东西。也许这样就能工作了

Node() : x(v.v[0]) {}

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

在不公开v.v的情况下,我如何才能按照我的意愿完成这项工作?

问题出在Node结构上。类初始化顺序不取决于在构造函数中指定的初始化顺序,而是取决于变量声明的顺序。

您基本上是在用一些奇怪的、统一的东西初始化double&,这是未定义的行为。

将申报单更改为

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

你会好起来的。