Definizione di variabili nelle if
Restando sempre in tema dei piccoli cambiamenti apportati al C++, è ora possibile definire una variabile nella condizione associata alla 'if'. Vediamo un esempio pratico...
Author: Mario Graziosi, mgnospam@fgasoftware.com
Restando sempre in tema dei piccoli cambiamenti apportati al C++, è ora possibile definire una variabile nella condizione associata alla 'if'. Vediamo un esempio pratico. Tradizionalmente, se avessimo voluto trovare una charattere all'interno di una stringa, usando le convenzionali funzioni del C, avremmo scritto:
char* p;
if (p = strchr('x', s))
printf("Trovato 'x' alla posizione %p", p);
Tuttavia la variabile 'p' sopravvive alla condizione e, se volessimo definire successivamente un'altra 'p' non potremmo. Il problema, se vogliamo, è analogo a quello del ciclo 'for' dove nel vecchio C++ la definizione della variabile sopravviveva oltre la fine del ciclo (questo non è più vero nel nuovo C++). L'esempio sopra, con il C++ ANSI, può essere riscritto così:
if (char* p = strchr('x', s))
printf("Trovato 'x' alla posizione %p", p);
In questo modo la 'p' è visibile solo all'interno del blocco (o statement) associato alla 'if'. E se dovesse esservi anche un blocco 'else' sarebbe altrettanto visibile al suo interno. Sicuramente 'p'; non sarà più visibile oltre la 'if'.
A prima vista questa nuova caratteristica può sembrare alquanto inutile o, per lo meno, poco necessaria nella pratica. Non è proprio così se pensiamo ad un caso molto comune:
TEdit* edit;
if (edit = dynamic_cast<TEdit*>(Sender))
edit->Text = "qualcosa";
Il segmento di codice sopra, tipico in un programma C++ Builder, deve assicurarsi che 'Sender' sia un TEdit prima di eseguire con sicurezza determinate operazioni. Codice analogo è molto simile anche in MFC (dove magari il dynamic_cast viene fatto da un tipo 'CWnd'). Il codice sopra può essere ora riscritto così:
if (TEdit* edit = dynamic_cast<TEdit*>(Sender))
edit->Text = "qualcosa";
con il vantaggio che 'edit' perde visibiltà immediatate dopo la 'if', evitando così di inquinare lo spazio di nomi locali alla funzione.