2013-05-08 126 views
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; 
} 

如果成員指針的推理鏈是到達內部成員的唯一解決方案,我可以使用模板將它封裝在單一類型中嗎?C++指向成員的指針


現在代碼可以使用GCC編譯

通過成員指針謝謝大家

+0

此代碼看起來很奇怪,我無法編譯。 究竟是什麼意思 A B :: * ba = &B::a; 你確定這是正確的嗎? 我看到如下代碼: A a; B b; b.a = a; 與指針相同的東西,但從未與「::」 – 2013-05-08 10:55:48

+1

@AdrianMaire:'AB :: * ba = &B::a;'聲明'ba'是指向'A'類型'B'成員的指針,並初始化它與'&B :: a'。它應該編譯好。 – 2013-05-08 11:07:16

+0

@Charles貝利:謝謝你,我會更多地瞭解這一點。 – 2013-05-08 11:34:37

回答

2

可以到達C :: B ::一個?

排序:

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

是指針推理鏈的唯一的解決辦法?