0

是否可以使用指向成员的指针访问复合类数据成员?以下代码无效,但演示了需要。

例如:

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 部分

4

4 回答 4

0

这是一些看起来很奇怪的语法,但如果我理解正确,您正试图通过 B 类访问 fA。如果是这种情况,那么您将需要在 A 类可供访问之前创建 B 类的实例。基本上,如果 B 不存在,您将无法访问其中的内容。错误就是它听起来的样子,“.fA 的左侧必须有一个类/结构/联合”,这意味着您的编译器无法确定 fA 的左侧是什么,因此“a”未定义或不存在. 此外,您在 B myB 中有一个重新定义错误:)

于 2013-04-08T12:56:40.467 回答
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
于 2013-04-08T12:54:26.787 回答
0

这里明显的“原因”是因为fA不是 B. 在这种特殊情况下,实现它可能不会导致任何特定问题,包括正交性规则和成员函数,我认为它无法实现。

当然,您可以做的是获取A 成员的地址B,然后fA通过它来访问:

A B::*ptr = &B::a;
(myB.*ptr).fa = 25.;

, 例如。(我不确定是否需要括号。这不是我经常使用的结构,足以让我记住优先级。)

于 2013-04-08T12:53:27.857 回答
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; }
};

指针的类型是 just double& (*)(void *),您甚至可以使用这种技巧,例如将数组元素作为成员返回。

于 2013-04-08T17:29:32.300 回答