Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Abbiamo provato Google Pixel 11, il più accessibile della nuova gamma: chip Tensor G6 condiviso con i modelli Pro, fotocamera 48 MP con Magic Capture e Stili Fotografici, display Actua da 3000 nit e batteria da 4985 mAh. Ecco come si comporta nell'uso quotidiano, e cosa cambia davvero rispetto a Pixel 11 Pro e Pro XL
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL debutta in Italia con il nuovo Tensor G6, lo Zoom Pro fino a 120x, il display Super Actua da 3600 nit e la new entry HiLight riservata ai modelli Pro: lo abbiamo provato in anteprima per diversi giorni prima del lancio commerciale, tra fotocamera generativa, ricarica ancora indietro rispetto ai rivali e un prezzo che parte da 1399 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-05-2005, 10:02   #1
Morpheus_/_Neo
Member
 
Iscritto dal: Aug 2002
Messaggi: 154
C++ creare instanze di oggetti dalla stringa del nome della classe

ciao a tutti.

come da titolo, vorrei sapere se in c++ e' possibile creare un'istanza di oggetto di una classe NOME_CLASSE avendo solo la stringa "NOME_CLASSE".

mi spiego meglio. In Java esiste il metodo statico newInstance(string X) che crea un oggetto di tipo X e ritorna una referenza di tipo Object che punta all'istanza creata. Vorrei sapere se esiste in c++ qualcosa di analogo per creare oggetti a runtime senza conoscerne la classe a design time.

grazie a tutti
M_/_N
Morpheus_/_Neo è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 11:59   #2
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
Che io sappia non c'è...in primo luogo perchè non tutti gli oggetti derivano da un oggetto base...

Fai una cosa di questo tipo...ti crei un oggetto base per tutti i tuoi tipi di oggetti (suppongo che gli oggetti che vuoi instanziare siano oggetti personalizzati)...
Codice:
class classe_base //classe base astratta
{
public:
   classe_base() {}; //costruttore di default
   virtual string tipo_classe() = 0; //funzione virtuale pura
};

class classe1: public classe_base //classe derivata da quella base
{
public:
   classe1() { };
   virtual string tipo_classe() { return "classe1"; };
};

class classe2: public classe_base //classe derivata da quella base
{
public:
   classe2() { };
   virtual string tipo_classe() { return "classe2"; };
};


//in oggetto è contenuto il tipo di oggetto da instanziare

classe_base *nuovo = NULL;

if(oggetto == "classe1") nuovo = new classe1;
if(oggetto == "classe2") nuovo = new classe2;
Il comportamento è simile a quello che cercavi...ma devi stare attento all'interfaccia... Se l'interfaccia è comune per tutte le classi e dichiari tutte le funzioni come viertuali nella classe base allora potrai usare indistintamente le classi a partire dalla classe base. Se non è così devi riconoscere se una istanza è quella dalla classe da te voluta tramite la funzione tipo_classe e poi fare un cast alla classe voluta...
Ad esempio:
Codice:
if(obj->tipo_classe == "classe1")
   ((classe1 *)obj)->funzione_della_classe1(.....);
if(obj->tipo_classe == "classe2")
   ((classe2 *)obj)->funzione_della_classe2(.....);
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 15:23   #3
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Morpheus_/_Neo
ciao a tutti.

come da titolo, vorrei sapere se in c++ e' possibile creare un'istanza di oggetto di una classe NOME_CLASSE avendo solo la stringa "NOME_CLASSE".

mi spiego meglio. In Java esiste il metodo statico newInstance(string X) che crea un oggetto di tipo X e ritorna una referenza di tipo Object che punta all'istanza creata. Vorrei sapere se esiste in c++ qualcosa di analogo per creare oggetti a runtime senza conoscerne la classe a design time.

grazie a tutti
M_/_N
Quello che cerchi di fare si chiama Reflection ed e' un concetto nativo di piattaforme quali Java e .NET (C# e parenti), oppure di linguaggi dinamici tipo Smalltalk, Python, Ruby.

Il C++ non supporta Reflection nativamente, e bisogna programmarsela a mano.
Cionci ti ha gia' indicato un modo per programmare quello che vuoi fare, che va benissimo se hai poche classi. Se il tuo sistema ha bisogno di supportare molte piu' classi, ti serve qualcosa di piu' flessibile, ma fino a quel momento l'implementazione di Cionci va benissimo.

Se ci dici con piu' precisione quello che vuoi fare possiamo esserti piu' di aiuto e magari indicarti implementazioni piu' flessibili (e complesse) se necessario.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 17:29   #4
Morpheus_/_Neo
Member
 
Iscritto dal: Aug 2002
Messaggi: 154
instanto grazie a tutti e due!

vediamo allora di porre il vero problema che devo risolvere...

ho N processi (che chiamero' MONITORATI) i quali danno in output degli oggetti di tipo ignoto a prori. Ho inoltre un processo MONITOR che si aggancia agli N monitorati tramite mem condivisa e deve estrarre gli oggetti che ogni processo da' in output.

ora di processi monitor ne posso avere M, ognuno in ascolto su gruppi eterogenei di processi, e non so a priori l'interfaccia dell'output proprio perche' ogni processo monitorato e' indipendente dagli altri mentre io voglio un processo monitor generalizzato.

tra le varie cose mi era venuto in mente il discorso di creare oggetti dalla stringa della loro classe, ma per il momento mi sto orientando verso qualcosa di molto piu a basso livello: leggere la mem condivisa byte a byte e interpretare e ricomporre i byte in base alle info pubblicate in un file. tali info descrivono per ogni processo il tipo e la disposizione delle variabili date in output (questo almeno devo saperlo a priori).

ecco qua il vero problema :-) se qualcuno ha qualche idea brillante... beh, intanto si becca un GRAZIE maiuscolo :-D

ciao e grazie ancora
M_/_N
Morpheus_/_Neo è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 17:33   #5
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
Ma i processi monitorati li fai tu ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2005, 19:40   #6
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Morpheus_/_Neo
ora di processi monitor ne posso avere M, ognuno in ascolto su gruppi eterogenei di processi, e non so a priori l'interfaccia dell'output proprio perche' ogni processo monitorato e' indipendente dagli altri mentre io voglio un processo monitor generalizzato.
Agli oggetti restituti da ogni processo puoi mandare messaggi e fargli compiere operazioni, oppure devi solo interrogarli per conoscerne le proprieta'?

Espando un po' la domanda di Cionci:
Quanti tipi diversi di processi hai? Prevedi di aggiungere in seguito altri tipi di processi? Puoi fare a meno di doverne aggiungere altri in seguito, quanto meno nella prima versione del tuo programma?

Riesci facilmente ad estrarre un'interfaccia comune a tutti i tipi di oggetto restituiti processi? Se no puoi cambiare leggermente le specifiche di modo da riuscirci?

In base alle risposte che dai, io avrei in mente un paio di soluzioni diverse.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2005, 13:37   #7
Morpheus_/_Neo
Member
 
Iscritto dal: Aug 2002
Messaggi: 154
allora, il problema e' proprio che i processi da monitorare non sono sviluppati ne specificati da me. io devo prenderli cosi come sono e leggerne l'output senza potergli far fare niente (i processi comunicano tra loro e il monitor deve essere il piu trasparente possibile per tali processi).

i processi dovrebbero essere 10 o 12 in un ambiente distribuito per cui ci sara' un monitor per macchina e ogni monitor sara' responsabile per un numero ignoto a priori di processi. inoltre ci sara' un monitor centralizzato che raccoglie le informazioni prelevate e inviategli dai singoli monitor dislocati sulle singole macchine.

non ho idea di cosa i vari processi daranno in output... so che saranno cose tipo array di double, matrici di int o double o numeri complessi (ma spero di no), ma purtroppo l'organizzazione del progetto fa talmente schifo che non posso escludere a priori che i processi scambino oggetti complessi... non so neanche che variabili elementari useranno... e i monitor devono essere general-purpose a sufficienza da fregarsene del processo specifico che stanno monitorando (potranno solo leggere da qualche parte una qualche descrizione dell'output del processo monitorato, ma ogni monitor avra' in carico piu' di un processo alla volta, e quindi non posso fare un monitor specifico per ogni processo... anche perche' diventerei stupido...). inoltre poiche' questi processi devono controllare un veicolo privo di pilota, hanno necessita' real time tali da non permettermi di fare grossi magheggi, quindi ho bisogno di roba leggera e veloce...

grazie mille a tutti per la disponibilita', davvero!
M_/_N
Morpheus_/_Neo è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2005, 22:46   #8
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Cerco di riassumere le specifiche per quello che ho capito:

1) Il monitor deve leggere dati dagli oggetti processi
2) Il monitor non deve dare comandi agli oggetti processi
3) La descrizione dei dati associati ad ogni tipo di oggetto processo e' contenuta in un qualche formato che e' disponibile
4) I tipi dei dati possono essere potenzialmente qualunque (nativi o complessi)
5) Il monitor deve essere abbastanza generico da gestire oggetti processo con tipi di dato differenti

Date le specifiche, il tuo problema e' un bel casino
Io cercherei di semplificarlo un po', inserendo qualche limitazione, ad esempio al punto 4). Se sei in grado di limitare i tipi dei dati, la soluzione al tuo problema diventa piuttosto semplice, un dizionario chiave/valore in cui organizzare i dati dei processi. La descrizione del dizionario e' contenuta nel file di descrizione.

Se non puoi mettere limiti ai tipi di dato, il tuo problema diventa molto complicato da risolvere in un linguaggio tipo C++ che non ha il concetto di "tipo dinamico".

Vedi se riesci a mettere una qualche limitazione al punto 4 e poi dimmi.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2005, 21:01   #9
Morpheus_/_Neo
Member
 
Iscritto dal: Aug 2002
Messaggi: 154
grazie mille ragazzi, davvero!

dunque ammesso e non concesso che io riesca a limitare il tipo di dati scambiati ai soli tipi elementari (int, double, array e matrici di int o di double), la soluzione che mi viene in mente e' leggere l'area di memoria condivisa byte a byte e poi ricomporre i byte secondo le info pubblicate che descrivono la struttura delle variabili nell'area di mem stessa. e' una buona soluzione o si puo' fare di meglio?

grazie di cuore a tutti
M_/_N
Morpheus_/_Neo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Arianespace Ariane 6: lanciato il satell...
Starship: la nave Forte ha caricato Ship...
ROCm 10 punta sull'AI agentica: AMD auto...
Meta cambia la privacy degli AI Glasses:...
Google ha lanciato Gemini 3.5 Transcribe...
MOVA M10, il lavapavimenti leggero che a...
DLSS 5 funziona anche sulle GeForce RTX ...
GeForce Now, 13 nuovi titoli supportati ...
Mac Studio e Mac mini, il genlock arriva...
Kyndryl porta l’IA agentica nella gestio...
L'era dello smartphone economico è...
NVIDIA mette il freno al suo progetto pi...
Corsair iCUE LINK TITAN II 360 RX LCD: l...
Scritti dalle AI per le AI: la fabbrica ...
La RTX 3060 da 12 GB è tornata ma il pre...
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: 00:44.


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