2012-03-16 17 views
7

In di this column, ha definito una struttura e un typedef come questo Mr Kenny Kerr:Qual è il significato di questo typedef?

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

Allora qual è il significato di questo typedef?

Un'altra domanda riguarda il seguente codice:

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

Qual è il significato di "& boolean_struct :: membro"?

risposta

13

In Mr Kenny Kerr questa colonna, ha definito una struttura e un typedef come questo:

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

allora qual è il significato di questo typedef?

Il typedef crea un tipo chiamato boolean_type che equivale a un puntatore a un membro int all'interno di un oggetto boolean_struct.

È non la stessa cosa a un puntatore a un int. La differenza è che un oggetto di boolean_type richiede un oggetto boolean_struct per dereferenziarlo. Un puntatore normale a un int non lo fa. Il modo migliore per vedere come questo è diverso è tramite alcuni esempi di codice.

consideri puntatori solo normali 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; 
} 

Ora considerare se abbiamo utilizzato puntatori a int membri all'interno di 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; 
} 

Come si può vedere, la sintassi e il loro comportamento sono diverso.

Un'altra domanda riguarda il seguente codice:

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

Qual è il significato di "& boolean_struct :: membro"?

Restituisce l'indirizzo della variabile member all'interno di boolean_struct. Vedi esempio di codice sopra.

+0

Grazie per la risposta. Ma non esiste alcun oggetto di boolean_struct, quindi a cosa puntano esattamente & boolean_struct :: member? – Rong

+1

@Rong: ciò a cui punta è un dettaglio di implementazione del compilatore. Di solito è implementato come una sorta di offset intero in un membro della classe. Ma il suo esatto valore numerico è irrilevante; ciò che è importante è che ti consente di accedere a una parte specifica di un oggetto di un certo tipo, senza riguardo per un'istanza specifica di quel tipo. È come se stessi indicando un arto sul corpo umano; Posso farlo senza riguardo per un individuo. Ecco perché l'espressione 'boolean_struct :: member' funziona; Posso puntare a 'member' all'interno di' boolean_struct' senza riguardo a un'istanza specifica. –

Problemi correlati