【问题标题】:C++: Pointer to composite class data memberC++:指向复合类数据成员的指针
【发布时间】:2013-04-08 12:30:56
【问题描述】:

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

例如:

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

【问题讨论】:

  • 你为什么要这样做?
  • @RogerRowland:你为什么这么问?
  • @6502 因为这是一个非常不寻常的问题,而且通常情况下,解决问题的方法完全不同。
  • 这里没有子类。 B 的成员的成员不是 B 的成员,因此不能使用指向 B 的成员的指针访问。
  • @ArneMertz:我已经在这里完成了我的问题:link

标签: c++ pointers member


【解决方案1】:

这里明显的“原因”是因为fA 不是 B。在这种特殊情况下,实施它可能会 不会引起任何特定问题,包括正交性规则,以及 对于成员函数,我认为不能实现。

你可以做的当然是获取A的地址 B的成员,然后通过它到达fA

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

。 (我不确定是否需要括号。 这不是我经常使用的结构 我脑子里的优先级。)

【讨论】:

    【解决方案2】:

    我同意评论者的观点,也许你应该问如何做你想要的,而不是如何做你认为会做你想做的事 :) p>

    至于问题:不,你不能通过这种方式访问​​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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        不,你不能,因为 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 *),您甚至可以使用这种技巧,例如将数组元素作为成员返回。

        【讨论】:

          猜你喜欢
          • 2018-03-24
          • 1970-01-01
          • 2013-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          相关资源
          最近更新 更多