我习惯使用引用作为内部变量的简写,否则访问会更加麻烦,例如:
{ 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公开的情况下按照我的意图制作此作品?
答案 0 :(得分:3)
问题出在Node
结构上。类初始化顺序不依赖于cosntructor中指定的初始化顺序,而是依赖于变量声明的顺序。
你基本上用一些奇怪的,单元化的东西初始化double&
,这是未定义的行为。
将声明的顺序更改为
struct Node
{
Vec3 v;
double &x;
Node() : v(Vec3()), x(v.x) {}
};
你会没事的。