2012-03-16 29 views
7

En la this column, que define una estructura y un typedef como este señor Kenny Kerr:¿Cuál es el significado de este typedef?

struct boolean_struct { int member; }; 
typedef int boolean_struct::* boolean_type; 

Entonces ¿cuál es el significado de este typedef?

Otra cuestión es preocupante el siguiente código:

operator boolean_type() const throw() 
{ 
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr; 
} 

¿Cuál es el significado de "& boolean_struct :: miembro"?

Respuesta

13

En el Sr. Kenny Kerr esta columna, que define una estructura y un typedef como esto:

struct boolean_struct { int member; };  
typedef int boolean_struct::* boolean_type;  

entonces ¿cuál es el significado de este typedef?

El typedef crea un tipo llamado boolean_type que es equivalente a un puntero a un miembro de int dentro de un objeto boolean_struct.

Es no lo mismo que un puntero a un int. La diferencia es que un objeto de boolean_type requiere un objeto boolean_struct para desreferenciarlo. Un puntero normal a int no lo hace. La mejor manera de ver cómo esto es diferente es a través de algunos ejemplos de código.

Considere punteros única normales a int s:

struct boolean_struct { int member; }; 

int main() 
{ 
    // Two boolean_struct objects called bs1 and bs2 respectively: 
    boolean_struct bs1; 
    boolean_struct bs2; 
    // Initialize each to have a unique value for member: 
    bs1.member = 7; 
    bs2.member = 14; 

    // Obtaining a pointer to an int, which happens to be inside a boolean_struct: 
    int* pi1 = &(bs1.member); 
    // I can dereference it simply like this: 
    int value1 = *pi1; 
    // value1 now has value 7. 

    // Obtaining another pointer to an int, which happens to be inside 
    // another boolean_struct: 
    int* pi2 = &(bs2.member); 
    // Again, I can dereference it simply like this: 
    int value2 = *pi2; 
    // value2 now has value 14. 

    return 0; 
} 

Consideremos ahora si usamos punteros a int miembros dentro de un boolean_struct:

struct boolean_struct { int member; }; 
typedef int boolean_struct::* boolean_type; 

int main() 
{ 

    // Two boolean_struct objects called bs1 and bs2 respectively: 
    boolean_struct bs1; 
    boolean_struct bs2; 
    // Initialize each to have a unique value for member: 
    bs1.member = 7; 
    bs2.member = 14; 

    // Obtaining a pointer to an int member inside a boolean_struct 
    boolean_type pibs = &boolean_struct::member; 

    // Note that in order to dereference it I need a boolean_struct object (bs1): 
    int value3 = bs1.*pibs; 
    // value3 now has value 7. 

    // I can use the same pibs variable to get the value of member from a 
    // different boolean_struct (bs2): 
    int value4 = bs2.*pibs; 
    // value4 now has value 14. 

    return 0; 
} 

Como se puede ver, la sintaxis y su comportamiento son diferente.

Otra cuestión es preocupante el siguiente código:

operator boolean_type() const throw() 
{  
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr; 
} 

¿Cuál es el significado de "& boolean_struct :: miembro"?

Esto devuelve la dirección de la variable dentro de una memberboolean_struct. Vea el ejemplo de código anterior.

+0

Gracias por la respuesta. Pero no hay ningún objeto de boolean_struct, entonces, ¿a qué se refiere exactamente & boolean_struct :: member? – Rong

+1

@Rong: lo que señala es un detalle de implementación del compilador. Por lo general, se implementa como un tipo de desplazamiento entero en un miembro de la clase. Pero su valor numérico exacto es irrelevante; lo importante es que le permite acceder a una parte específica de un objeto de cierto tipo, sin tener en cuenta una instancia específica de ese tipo. Es como si señalara una extremidad en el cuerpo humano; Puedo hacer eso sin tener en cuenta a un individuo. Es por eso que la expresión 'boolean_struct :: member' funciona; Puedo señalar 'member' dentro de' boolean_struct' sin tener en cuenta una instancia específica. –

Cuestiones relacionadas