gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:01:35 26 4
gpt4 key购买 nike

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

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.v.v[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 是私有(private)的,我真的希望它保持这种状态。

如何在不公开 v.v 的情况下按照我的预期进行这项工作?

最佳答案

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

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

将声明的顺序更改为

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

你会没事的。

关于c++引用作为私有(private)变量的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38553290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com