C++指向成员的成员的指针

5
//#define NOT_WORKS
#define HOW(X) 0

struct A {

};

struct B {
    A a;
};

struct C {
    B b;
};

int main(int argc, char **argv) {
    A B::*ba = &B::a;       // ba is a pointer to B::a member
    B C::*cb = &C::b;       // cb is a pointer to C::b member

#ifdef NOT_WORKS

    { A C::*ca = &C::b::a; }    // error: Symbol a could not be resolved / error: ‘C::b’ is not a class or namespace
    { A C::*ca = cb + ba; }     // error: invalid operands of types ‘B C::*’ and ‘A B::*’ to binary ‘operator+’

    A C::*ca = HOW(???);        // is possible to reach C::b::a by a member pointer?

#endif

    C cptr;
    A aptr = cptr.*cb.*ba;  // is pointer inference chaining the only solution?

    return 0;
} 

如果成员指针的推理链接是到达内部成员的唯一解决方案,我是否可以使用模板将其封装在单个类型中?


现在代码可以使用gcc编译

谢谢大家


这段代码看起来非常奇怪,我无法编译它。 它确切的意思是什么? A B::*ba = &B::a; 你确定这是正确的吗?我见过类似的代码: A a; B b; b.a=a;还有指针的情况,但从未出现过"::"。 - Adrian Maire
1
@AdrianMaire: B::*ba = &B::a; 声明了 ba 是一个类型为 AB 成员指针,并使用 &B::a 进行初始化。它应该能够通过编译。 - CB Bailey
@Charles Bailey:谢谢你,我会更多地了解它。 - Adrian Maire
以上代码中不存在 C::b::a 这样的东西。:: 的左侧必须是命名空间或类型名称。C::b 不是其中任何一个。 - bames53
1个回答

2

有可能通过成员指针访问C::b::a吗?

有点类似:

C c; 
A B::*ca = &B::a;  //    usage: c.b.*ca;  

指针推断链接是唯一的解决方案吗?
是的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接