56 votes

Un typedef déroutant implique la portée de classe

Je suis en train de lire le code d'un projet C++ et il contient du code de la forme suivante:

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

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

Quelqu'un peut m'expliquer le sens de l' typedef ligne? type semble être une sorte de pointeur de membre de l' ns::B des points de ns::A, mais je ne suis pas sûr.

Classe A et B dans le code réel ne sont pas vides, mais je pense qu'il n'est pas pertinent ici. Et ici est un exemple vivant.

39voto

vsoftco Points 3170
 ns::B::*
 

est une variable pointeur-membre-membre de B . Alors ns::A* est son type.

Donc, toute la déclaration signifie

pointeur sur membre variable de B de type ns::A*

27voto

R Sahu Points 24027

La réponse de @vsoftco répond déjà au coeur de la question. Cette réponse montre comment utiliser un tel 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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X