Programmazione orientata agli oggetti in ANSI-C. Un esempio – list

Come esempio di quanto possiamo fare con isOf() e come cast() può rendere più sicuro il codice, consideriamo le modifiche seguenti in relazione al programma di test.

#include "Circle.h"
#include "List.h"
int main (int argc, char ** argv)
{ void * q;
unsigned n;
initList();
initCircle();
q = new(List, 1);
while (* ++ argv)
switch (** argv) {
case ’+’:
switch ((* argv)[1]) {
case ’c’:
addFirst(q, new(Circle, 1, 2, 3));
break;
case ’p’:
addFirst(q, new(Point, 4, 5));
break;
default:
addFirst(q, new(Object));
}
break;
case ’—’:
puto(takeLast(q), stdout);
break;
case ’.’:
n = count(q);
while (n —— > 0)
{ const void * p = takeFirst(q);
if (isOf(p, Point))
draw(p);
else
puto(p, stdout);
addLast(q, p);
}
break;
default:
if (isdigit(** argv))
addFirst(q, (void *) atoi(* argv));
else
addFirst(q, * argv + 1);
}
return 0;
}

Per argomenti che iniziano con + il programma aggiunge cerchi, punti e altri oggetti ad una lista. L'argomento – rimuove l'ultimo oggetto e lo mostra con puto(). L'argomento . mostra il contenuto corrente della lista, draw() viene usato se una entry è derivata da Point. Infine, vi è un deliberato tentativo di inserire numeri o altre stringhe come argumenti nella lista sebbene essi possano causare problemi quando vengono rimossi. Ecco un esempio di un possibile output:

$ list +c +p + — . 1234
Circle at 0x122f4
Object at 0x12004
"." at 4,5
Object.c:66: failed assertion `sig == 0’

Come vedremo nella sezione 8.4, addFirst() usa cast() per assicurarsi che vengano aggiunti solamente oggetti alla lista. Cast() può essere inoltre resa più robusta e quindi avere la capacità di scoprire se una stringa o un numero vengono passati come oggetti.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend