是否可以使用指向成员的指针访问复合类数据成员?以下代码无效,但证明了需要。
例如:
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.;
}
我在这里完成了我的问题:Pointer to composite class data member - Part 2
答案 0 :(得分:0)
这里明显的“原因”是因为fA
不是其成员
B
。在这种特殊情况下,可能会实施它
没有引起任何特殊问题,正统性规则和
对于成员函数,我认为不能实现。
你可以做的当然是取A
的地址
B
的成员,然后通过它访问fA
:
A B::*ptr = &B::a;
(myB.*ptr).fa = 25.;
例如,。 (我不确定是否需要括号。 这不是我经常使用的构造 我头脑中的优先权。)
答案 1 :(得分:0)
我同意评论者的意见,可能你应该问如何做你想要什么,而不是如何做你认为会做你想做的事情:)
至于问题:不,你不能以这种方式访问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
答案 2 :(得分:0)
这是一些奇怪的语法,但如果我理解正确,你试图通过类B访问fA。如果是这种情况,那么你需要在类A可用之前创建一个B类实例访问。基本上,如果B不存在,则无法访问其中的内容。这个错误听起来就是这样,“.fA必须有一个类/结构/联合”,这意味着你的编译器无法弄清楚fA左边是什么,所以“a”未定义或不存在。此外,您在B myB中有重新定义错误:)
答案 3 :(得分:0)
不,你不能,因为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 *)
,您可以使用这种技巧,例如,作为成员返回数组元素。