2013-10-24 10 views
7

Ho una variabile privata definita come:come usare const_cast?

const int studentNumnber; 

Sto cercando di scrivere un costruttore di copia e ho bisogno di gettare via la costanza per fare questo, purtroppo, non capisco come usare const_cast.

questo è quello che sto cercando di fare nel mio costruttore di copia:

Student(const Student & s) 
     : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0),  studentNumber(0){ 
     school = new char[strlen(s.school) +1]; 
     strcpy_s(school, strlen(s.school) +1, s.school); 
     const_cast<int*>(this)->studentNumber = s.studentNumber; 
      //studentNumber= s.studentNumber); 
    } 

Questo non funziona ... non sono sicuro di ciò che la sintassi è per fare questo

+0

Questo è folle. Cos'è 'e'? Dovresti semplicemente avere 'studentNumber (s.StudentNumber)' nella lista di inizializzazione; o meglio, non scrivere affatto un costruttore di copie. –

risposta

30

Non sei consentito alle variabili const_cast che sono in realtà const. Ciò si traduce in un comportamento indefinito. const_cast viene utilizzato per rimuovere la costante da riferimenti e puntatori che in definitiva si riferiscono a qualcosa che non è const.

Quindi, questo è consentito:

int i = 0; 
const int& ref = i; 
const int* ptr = &i; 

const_cast<int&>(ref) = 3; 
*const_cast<int*>(ptr) = 3; 

E 'consentito perché i, l'oggetto che viene assegnato a, non è const. Il seguito non è consentito:

const int i = 0; 
const int& ref = i; 
const int* ptr = &i; 

const_cast<int&>(ref) = 3; 
*const_cast<int*>(ptr) = 3; 

perché qui i è const e si sta modificando l'assegnandogli un nuovo valore. Il codice verrà compilato, ma il suo comportamento è indefinito (che può significare qualsiasi cosa da "funziona perfettamente" a "il programma si blocca".)

Si dovrebbero inizializzare i membri di dati costanti negli inizializzatori del costruttore invece di assegnarli in il corpo dei costruttori:

Student(const Student & s) 
    : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), 
     school(0), 
     studentNumber(s.studentNumber) 
{ 
    // ... 
} 
+0

Capisco che non dovrei farlo, ma sfortunatamente devo usare const_cast in quanto è stato impostato questo compito. Non capisco la sintassi per il codice. So che è questo: const_cast < new_type > (espressione) \t \t ma non lo capisco. – Sarah

+2

@Sarah, quindi il tuo compito ti costringe a invocare un comportamento indefinito e il tuo professore non dovrebbe essere sorpreso se i risultati differiscono. Questo presuppone che si compili in primo luogo. – chris

+0

@Sarah ha aggiunto l'utilizzo const_cast. – timrau

-1

Nel codice si sta provando a lanciare questo puntatore anziché la variabile. Puoi provare quanto segue:

Student(const Student & s) 
    : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0),  studentNumber(0){ 
    school = new char[strlen(s.school) +1]; 
    strcpy_s(school, strlen(s.school) +1, s.school); 
    ***const_cast<int*>(&studentNumber) = s.studentNumber;**    
}