Anche se non abbiamo ancora implementato le stringhe, siamo già capaci di leggere un semplice programma di test. String.h definisce il tipo di dato astratto:
extern const void * String;
Tutti i nostri metodi sono comuni a tutti gli oggetti; di conseguenza, aggiungiamo la loro dichiarazione al file new.h che contiene gli header per le funzioni di gestione della memoria, file che abbiamo già introdotto nella sezione 1.4.
void * clone (const void * self); int differ (const void * self, const void * b); size_t sizeOf (const void * self);
I primi due prototipi dichiarano i selettori. Sono derivati dai corrispondenti componenti di struct Class semplicemente rimuovendo una indirezione dai dichiaratori. Ecco un esempio applicativo:
#include "String.h" #include "new.h" int main () { void * a = new(String, "a"), * aa = clone(a); void * b = new(String, "b"); printf("sizeOf(a) == %u\n", sizeOf(a)); if (differ(a, b)) puts("ok"); if (differ(a, aa)) puts("differ?"); if (a == aa) puts("clone?"); delete(a), delete(aa), delete(b); return 0; }
In questo codice si creano due stringhe e si fa una copia delle stesse. Mostriamo la dimensione di un oggetto Stringa - non la dimensione del testo controllato dall'oggetto ! - e verifichiamo che due testi diversi siano contenuti in stringhe diverse. Infine, controlliamo che una copia sia uguale ma non identica all'originale e cancelliamo le stringhe. Se tutto fosse corretto il programma stamperebbe qualcosa come
sizeOf(a) == 8 ok