Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-08-2010, 19: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, 20: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, 20: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, 22: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, 09: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, 13: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, 13: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, 14: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, 14: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, 15: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, 15: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, 15: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, 16: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, 16: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, 16: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, 16: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, 10: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


DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
SpaceX vuole portare nello Spazio 1 mili...
Realme 16: il nuovo mid-range che si isp...
DAZN lancia il piano Full Mobile a 19,99...
Samsung Galaxy S26, ormai è tutto...
Smartphone sempre più cari: super...
L'ultima puntata di Falsissimo rimossa d...
NASA Perseverance ha utilizzato percorsi...
Blue Origin sospende per almeno due anni...
Stampanti, Los Angeles verso il divieto ...
Roscosmos Amur: il razzo spaziale riutil...
Robot aspirapolvere per tutte le tasche:...
Accedere alle mail di un lavoratore lice...
Amazon Haul scatenato: migliaia di prodo...
Amazon Seconda Mano rilancia: sconto ext...
Super prezzo Amazon per ECOVACS DEEBOT T...
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: 22:06.


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