【问题标题】:C++ Pointer to member of memberC++ 指向成员成员的指针
【发布时间】:2013-05-02 13:10:48
【问题描述】:
//#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.a=a;和指针一样的东西,但从不使用“::”
  • @AdrianMaire: A B::*ba = &B::a; 声明 ba 是指向 B 类型为 A 的成员的指针,并使用 &B::a 对其进行初始化。它应该编译得很好。
  • @Charles Bailey:谢谢,我会了解更多。
  • 上面的代码中没有C::b::a 这样的东西。 :: 的左侧必须是命名空间或类型名称。 C::b 不是其中任何一个。

标签: c++ member-pointers


【解决方案1】:

可以通过成员指针到达 C::b::a 吗?

种类:

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

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

是的

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多