PDA

View Full Version : [C++] Incognita classi derivate


Unrue
30-10-2008, 19:09
Ciao ragazzi,
ho un dubbio su un programma che sto sviluppando in C++. Dunque, questo programma legge degli eventi da un file di testo. Gli eventi possono essere di due tipi, supponiamo EVENTOA, EVENTO_B.

Ora, al momento c'è una classe base EVENTO, e le due derivate A e B, ognuna delle quali gestisce l'evento appropriato. il fatto è che a priori non so quale delle due classi derivare, in quanto dipende da quello che c'è scritto nel file di testo. Quindi, come posso reimpostare il codice in maniera adatta al problema?

Ovviamente vorrei evitare di derivarle entrambe, in quanto non è detto che ci siano sempre entrambi gli eventi. Siccome il file di testo è letto dalla classe base, avevo pensato di analizzare il primo evento e poi dalla classe base creare oggetti figli, e da lì far partire il tutto. Ma non credo che sia molto elegante.

Thanks :)

cionci
30-10-2008, 20:00
Direi che non è proprio bello fare una classe base non astratta, significa che c'è bisogno di un ulteriore livello di astrazione.

Supponiamo che la prima riga della parte del testo relativa alla classe permetta di discriminare quale classe istanziare (supponiamo che ci sia scritto "EVENT_A" o "EVENT_B".

Leggi la prima riga e la passi ad un factory method...

static Event * YourClass::MainFactoryMethod(string classType)
{
return (classType.compare("EVENT_A") == 0) ? new EventA() : ((classType.compare("EVENT_B") == 0) ? new EventB() : new NullEvent());
}

Unrue
31-10-2008, 10:51
Direi che non è proprio bello fare una classe base non astratta, significa che c'è bisogno di un ulteriore livello di astrazione.

Supponiamo che la prima riga della parte del testo relativa alla classe permetta di discriminare quale classe istanziare (supponiamo che ci sia scritto "EVENT_A" o "EVENT_B".

Leggi la prima riga e la passi ad un factory method...

static Event * YourClass::MainFactoryMethod(string classType)
{
return (classType.compare("EVENT_A") == 0) ? new EventA() : ((classType.compare("EVENT_B") == 0) ? new EventB() : new NullEvent());
}


Ottima idea, Grazie;) Supponiamo però che, una volta lanciata l'applicazione, voglio che faccia tutto da sola, ovvero, veda quale è la prima classe da derivare e poi continua con gli eventi, quale è il metodo migliore per fare ciò? Cioè, al momento ho messo nel main il lancio del metodo factory, con al suo interno il controllo sul primo evento.

cionci
31-10-2008, 11:40
Spiega meglio.

Unrue
31-10-2008, 11:43
Allora,
dquando gestisco i vari eventi, la prima volta che incointro quel tipo di evento, faccio l'apposita derivazione. Quindi nel main ho una cosa del genere, al momento:

TestFactory prova(argv[1], rank, num_procs,false);
prova.MainFactoryMethod();
prova.start_computation();

In questo modo però, gestisco un solo evento, il primo. Io invece avrei bisogno, con una sola chiamata dal main, di gestirli tutti. Quindi il programma dovrebbe, la prima volta che incontra un evento, derivare la classe, e successivamente gestire gli altri, usando gli oggetti già utilizzati. Quindi quando incontra un evento già visto, non deriva di nuovo, ma utilizza l'oggetto vecchio.

cionci
31-10-2008, 11:48
Per questo devi semplicemente fare una nuova classe che fa il parsing del file, ogni volta che incontra una nuova istanza nel file di testo chiama il factory method.