2015-11-17 3 views
56

Я читаю код проекта C++ и содержит некоторый код следующего вида:запутанных ЬурейиЕ включает класс сферу

namespace ns { 
    class A {}; 
    class B {}; 
} 

struct C { 
    typedef ns::A* ns::B::* type; 
}; 

Может кто-нибудь объяснить смысл typedef линий? type, кажется, какой-то указатель на член ns::B, который указывает на ns::A, но я не уверен.

Класс A и B в реальном коде не пустые, но я думаю, что здесь это не актуально. И вот live example.

+0

Как используется этот тип? Можете ли вы привести некоторые примеры этого? –

+1

[странный материал] (http://ideone.com/qFMwRW) действительно! @JoachimPileborg –

+1

выглядит как указатель на функцию-член, но параметры отсутствуют. Возможно, это эквивалентно типу typedef ns :: A * ns :: B :: *(); ' – user463035818

ответ

41
ns::B::* 

является переменной-указателем-членом-членом B. Тогда его тип ns::A*.

Таким образом, вся декларация означает

указатель на член-переменную B типа ns::A*

+0

Таким образом, код, кажется, не так сложно понять. Мне нужно больше узнать о указателе-к-члену :) – xovano

+1

@xovano Спецификаторы пространства имен - вот что заставляет его выглядеть противно. В противном случае что-то вроде 'int Foo :: *' понимается всеми. – vsoftco

28

The answer by @vsoftco уже отвечает ядро ​​вопроса. Этот ответ показывает, как можно использовать такой typedef.

#include <iostream> 
#include <cstddef> 

namespace ns { 

    struct A {}; 

    struct B 
    { 
     A* a1; 
     A* a2; 
    }; 
} 

struct C { 
    typedef ns::A* ns::B::*type; 
}; 

int main() 
{ 
    C::type ptr1 = &ns::B::a1; 
    C::type ptr2 = &ns::B::a2; 

    ns::B b1; 
    b1.*ptr1 = new ns::A; // Samething as b1.a1 = new ns::A; 

    return 0; 
} 
+1

'b1. * Ptr1' Woah. Значит, это локальные смещения указателей? (То есть вы разыскиваете 'ptr1' с адресом' b' в качестве начальной точки?) – JAB

+2

@JAB Это хороший способ подумать об этом. – vsoftco