指向复合类数据成员的指针
C++: Pointer to composite class data member
是否可以使用指向成员的指针访问复合类数据成员?下面的代码是无效的,但证明了需要。
例如:class A
{
public:
float fA;
};
class B
{
public:
float fB;
A a;
};
void test()
{
// Use of member pointer to access B::fB member
float B::*ptr = &B::fB; // -> OK
B myB;
myB.*ptr = 25.;
// Use of member pointer to access B::a.fA member ???
float B::*ptr2 = &B::a.fA; // -> ERROR
B myB.*ptr2 = 25.;
}
我已经在这里完成了我的问题:复合类数据成员的指针-第2部分
这里明显的"原因"是因为fA
不是B
。在这种特殊情况下,实现它可能会不会引起任何特别的问题,既有正交规则,又有对于成员函数,我认为它是不可能实现的。
你能做的,当然是取A
的地址B
的成员,然后通过它到达fA
:
A B::*ptr = &B::a;
(myB.*ptr).fa = 25.;
例如。(我不确定是否需要括号。这不是一个我经常使用的结构)
我同意评论者的观点,也许你应该问如何做你想做的,而不是如何做你认为会做你想做的:)
对于这个问题:no,你不能以这种方式访问B::a.fA
。但是,您可以执行以下操作:
A myA;
float A::*ptr2 = &A::fA; // -> OK now
myB.a.*ptr2 = 25.;
或以下:
A B::*ptr3 = &B::a;
(myB.*ptr3).fA = 1.0f; // -> OK too
这是一些奇怪的语法,但如果我理解正确的话,你正试图通过类B访问fA。如果是这种情况,那么你需要在类A可用之前创建类B的实例。基本上,如果B不存在,你就不能访问它里面的内容。这个错误听起来就像,"左边的。fA必须有一个类/结构/联合"意味着你的编译器不能弄清楚什么是fA的左边,所以"a"是未定义的或不存在。此外,你有一个重定义错误在那里与B myB:)
不可以,因为c++语法不允许这样做。我看不出你想做的事情有什么特别之处,只是语言中没有考虑到。
但是请注意,指向数据成员的指针是一个对象,给定实例将返回对特定数据成员的引用。您可以手动实现此功能,放宽限制:struct A
{
double x;
double y;
static double& x_of(void *p) { return ((A *)p)->x; }
static double& y_of(void *p) { return ((A *)p)->y; }
};
struct B
{
double z;
A a;
static double& x_of(void *p) { return ((B *)p)->a.x; }
static double& y_of(void *p) { return ((B *)p)->a.y; }
static double& z_of(void *p) { return ((B *)p)->z; }
};
指针的类型仅为double& (*)(void *)
,您甚至可以使用这种技巧,例如将数组元素作为成员返回。
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 共享 C++ 的数据成员指针
- C++数据成员:值与指针
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 如何在C++中使用类对象访问指针数据成员
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- 通过指针算法访问结构数据成员
- 如何强制实施有关指针数据成员的常量正确性
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 检查课程是否具有指针数据成员
- 处理类的指针数据成员的动态内存
- 在堆上启动的指针数据成员
- 运算符重载与 C++ : 具有指针数据成员的类
- 我是否需要清理非指针数据成员
- 在堆或堆栈上的指针类实例中分配C++非指针数据成员
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 移动非指针数据成员的语义
- c++:指针数据成员在类继承层次结构中的行为