Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-08-2010, 18:28   #1
Damage92
Senior Member
 
L'Avatar di Damage92
 
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
[C++] capire di che tipo è una classe

Salve!
Sto usando il C++. Ho una lista di elementi eterogenei, tutti derivati dalla stessa classe (che è astratta). Devo eseguire un metodo di tutti gli elementi della lista usando un ciclo con un puntatore di tipo della classe base (se c'è un altro modo benvenga!), ma va eseguito solo su quelli di un certo tipo.
Però non so come riconoscere di che tipo è ogni elemento della lista...

Se può essere utile il metodo da eseguire è ereditato come virtuale dalla classe base.

Grazie!
Damage92 è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2010, 19:12   #2
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
http://msdn.microsoft.com/en-us/libr...8vs.71%29.aspx
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2010, 19:25   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
Usare la RTTI dentro un ciclo su un array con parecchi elementi. Mi sembra proprio una buona idea

A parte la RTTI che la eviterei per motivi "idelogici" oltre che prestazionali, puoi sempre mettere il check del tipo corretto dentro il metodo virtuale, che non fa nulla se non è del tipo giusto.
Altrimenti puoi mettere nella classe base una stringa col tipo che viene riempita dalle classi figlie, e viene usata per il check.
Altrimenti... ce ne sono di modi

Di solito definendo meglio il problema puoi capire come evitare il riconoscimento della classe...
per esempio, perchè dato un array di classi base devi distinguerle a seconda della classe figlia?
Idealmente le classi figlie le tratti come la classe base senza saperne niente, quindi è già poco elegante dover distinguere.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2010, 21:18   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Visitor design pattern?
Se è questo il caso, a questa pagina trovi la spiegazione, e in calce link a vari esempi, tra cui alcuni in C++.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 08:54   #5
Damage92
Senior Member
 
L'Avatar di Damage92
 
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
Grazie a tutti per le risposte!

Sono ancora agli inizi, dunque non ho ben capito come funziona la RTTI... in pratica l'operatore typeid è in grado di determinare il tipo della classe?

Il visitor design pattern sembra interessante, ma penso mi ci vorrebbero ore per capirlo! Però, da quello che dice l'articolo di wikipedia, sembra una lettura utile

@Tommo
In effetti avevo pensato a queste due soluzioni, ma immaginavo che ci potesse essere già*uno strumento del linguaggio per fare ciò. Per ora ho implementato il metodo virtuale.

Per rispondere alla domanda, innanzitutto non è un array, ma una lista (un link vale mille parole: http://it.wikipedia.org/wiki/Struttura_dati#Lista).
Il programma è un lettore di feed rss... nella lista ci sono i feed, le cartelle, e altri elementi (cerca, segnalibri), e in futuro potrei aggiungerne altri...
Quando devo aggiornare tutti i feed, il metodo "aggiorna" deve essere chiamato solo sui feed, di certo non sulle cartelle
In effetti dubito che il modo in cui ho strutturato i dati in memoria sia... il migliore, ma non ho trovato un altro modo
Damage92 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 12:36   #6
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
A questo punto avrei una curiosità, cosa ti ha spinto a creare una superclasse per classi che a primo impatto non mi sembra abbiano nulla in comune?
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 12:54   #7
Kralizek
Senior Member
 
L'Avatar di Kralizek
 
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
Quote:
Originariamente inviato da oNaSsIs Guarda i messaggi
A questo punto avrei una curiosità, cosa ti ha spinto a creare una superclasse per classi che a primo impatto non mi sembra abbiano nulla in comune?
ad occhio direi che vede una cartella ed un feed rss entrambi come un contenitore di "articoli"
Kralizek è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 13:15   #8
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Ok, ma il segnalibro a questo punto cosa avrebbe in comune con questi "contenitori"?
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 13:23   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Kralizek Guarda i messaggi
ad occhio direi che vede una cartella ed un feed rss entrambi come un contenitore di "articoli"
In ogni caso non vedo perché non avrebbe potuto mantenere una lista di cartelle ed una lista di feed separate...

Come in molti altri casi il problema è da affrontare altrove. Un collection così etorogenea non ha senso di esistere.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 14:33   #10
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da cionci Guarda i messaggi
In ogni caso non vedo perché non avrebbe potuto mantenere una lista di cartelle ed una lista di feed separate...

Come in molti altri casi il problema è da affrontare altrove. Un collection così etorogenea non ha senso di esistere.
che è proprio quello che intendevo io...
IMHO la riflessività diventa utile solo quando si usano tipi generici, nelle normali gerarchie polimorfiche se serve è solo un problema di design
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 14:42   #11
Damage92
Senior Member
 
L'Avatar di Damage92
 
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
Hanno diverse cose in comune.

Sto utilizzando le gtkmm, e tutti gli elementi di questa lista vengono visualizzati in un albero (gtk::treeview). Per cui hanno in comune una stringa, un'icona, una variabile che identifica la linea nell'albero, e tre metodi relativi alla gui.

Le informazioni di ogni elemento sono scritte anche in un file xml, per cui hanno in comune una variabile (un tipo di libxml2) che mi permette di puntare velocemente ai dati scritti su disco.


Forse il vero errore che ho fatto è la scelta del tipo di struttura dati
Ho creato delle liste (ogni cartella punta ad un'altra lista) che rispecchia in memoria la gerarchia che gli elementi hanno nella gui.
Ho provato a cercare un modo per memorizzare gli elementi e poi, separatamente, descrivere la loro posizione nell'albero, ma non mi è venuto nulla in mente
Damage92 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 14:49   #12
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Beh, perchè il metodo aggiorna deve essere chiamato sui feeds ma non sulle cartelle?
Mi sembra fattibilissimo fare un metodo aggiorna delle cartelle che non fa nulla

Sennò io farei così:
creerei una classe Updater, e una classe Listener (o Observer che dir si voglia) Updater::Listener.
Updater mantiene una lista di classi Listener, su cui chiama update quando l'applicazione gli viene richiesto tramite un metodo apposito.

Quindi, la tua classe principale possiede un Updater (o più di una, vedi se serve) in cui a loro volta vengono registrati i feeds e tutto quello che eredita Updater::Listener.
In questo modo tra l'altro separi la gestione della GUI e dell'albero dalla gestione degli updates, che sono due cose diverse...
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 15:03   #13
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Approvo l'observer. E' sicuramente il modo più semplice per operare su una architettura già "formata".
Un feed si registra sull'observer al momento della creazione e si deregistra al momento della distruzione.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 15:16   #14
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Damage92 Guarda i messaggi
Hanno diverse cose in comune.

Sto utilizzando le gtkmm, e tutti gli elementi di questa lista vengono visualizzati in un albero (gtk::treeview). Per cui hanno in comune una stringa, un'icona, una variabile che identifica la linea nell'albero, e tre metodi relativi alla gui.

Le informazioni di ogni elemento sono scritte anche in un file xml, per cui hanno in comune una variabile (un tipo di libxml2) che mi permette di puntare velocemente ai dati scritti su disco.
Secondo me le hai infarcite troppo queste classi.
Sono classi che gestiscono sia la GUI che i dati. Insomma il solito calderone mono-tier
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 15:21   #15
Damage92
Senior Member
 
L'Avatar di Damage92
 
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
Quote:
Originariamente inviato da Tommo Guarda i messaggi
creerei una classe Updater, e una classe Listener (o Observer che dir si voglia) Updater::Listener.
Updater mantiene una lista di classi Listener, su cui chiama update quando l'applicazione gli viene richiesto tramite un metodo apposito.
In pratica una lista dei soli feed... in effetti è la soluzione più semplice
Ora ho implementato l'idea del metodo virtuale, anche perché mi sono reso conto che "aggiorna" su una cartella potrebbe significare "aggiorna tutti i feed contenuti nella cartella"

Ma quando si usano i doppi due punti (come Update::Listener) significa che Listener deriva da Updater? E perché usare una classe Listener, e non direttamente la classe Feed?

grazie a tutti
Damage92 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 15:43   #16
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
No, per avere una classe
Quote:
Updater::Listener* qualcosa = new Updater::Listener()
devi scrivere una cosa tipo

Codice:
class Updater
{
    class Listener
    {
         ...
    };

    ...
};
Che non è una classe derivata ma "nested", cioè una dentro l'altra.
In realtà potevi fare anche una classe a parte, ma a me piace farlo così

Comunque il pattern Observer è si una lista dei soli feed, nel tuo caso, ma è anche molto di più.
Per esempio potresti renderti conto che vuoi altri oggetti aggiornabili oltre ai feeds, e funzionerebbe uguale. Oppure potresti gestire liste che si aggiornano in momenti diversi. eccetera...
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 09:53   #17
Damage92
Senior Member
 
L'Avatar di Damage92
 
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Che non è una classe derivata ma "nested", cioè una dentro l'altra.
In realtà potevi fare anche una classe a parte, ma a me piace farlo così

Comunque il pattern Observer è si una lista dei soli feed, nel tuo caso, ma è anche molto di più.
Per esempio potresti renderti conto che vuoi altri oggetti aggiornabili oltre ai feeds, e funzionerebbe uguale. Oppure potresti gestire liste che si aggiornano in momenti diversi. eccetera...
Questa della classe nested non la sapevo proprio!
Anche i Design Pattern e gli Anti-Pattern non li conoscevo!

Grazie mille!
Damage92 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Infineon apre il 2 luglio lo Smart Power...
Crimson Desert non si ferma: il gioco di...
Con iOS 27 l'iPhone si ripristina da sol...
Visa porta i pagamenti in ChatGPT: gli a...
OpenAI valuta un 'drastico' taglio dei p...
Il MacBook con display touch si far&agra...
Google promette di restituire più...
Quattro monitor 4K, doppia LAN 2.5G e Wi...
ROG Equalizer, il cavo 'salva-GPU': prim...
Falla critica CVSS 9.8 in Oracle PeopleS...
Microsoft accelera su Edge: aggiornament...
AMD ha corretto un bug da 10.000 dollari...
Vertiv: data center, la corsa dell’IA sp...
Siri non diventerà la tua fidanzata virt...
Prezzi in crescita del 200% e forniture ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:28.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v