c++引用作为私有变量的简写
c++ reference as shorthand to private variable
我有一个习惯,就是使用引用作为内部变量的简写,否则访问起来会更麻烦,例如:
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) {}
};
你会好起来的。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用