Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Buonasera a tutti, sto effettuando la migrazione dal C al C++ nello sviluppo AVR, principalmente per usufruire del paradigma OOP.
Ho seguito una o due guide giusto per individuare le differenze fondamentali, e credo di essermi fatto una discreta panoramica delle innovazioni legate al linguaggio.
Nello sviluppo di una libreria per la gestione della seriale UART, ho optato per una classe statica che ad ogni modulo UART successivo al principale si potesse ereditare es l'UART0, UART1, UART2, ecc Solo che non riesco a capire se il C++ permetta l'utilizzo di una classe esclusivamente statica come lo permette il C#, nel senso, è possibile utilizzare metodi della suddetta classe senza crearne un istanza della stessa? se non ho capito male il namespace sarebbe piu adatto a questo utilizzo ma non credo supporti l'ereditarietà.
Grazie per ogni delucidazione.
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
il namespace è solo un contenitore di classi.
Il C++ supporta solo classi statiche, ovvero non esistono metodi che possano essere chiamati senza istanziare un oggetto. Questo per il semplice motivo che non c'è necessità. In C# si, perchè un metodo può essere solo all'interno di una classe. In C++ no.
Ultima modifica effettuata da TheDarkJuster il 16/09/2014 alle 23:14 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da Roby94:
ho optato per una classe statica che ad ogni modulo UART successivo al principale si potesse ereditare es l'UART0, UART1, UART2, ecc
|
Mm, questo potrebbe essere un uso inappropriato della programmazione ad oggetti... si potrebbe dire con piu' certezza data una spiegazione piu' in dettaglio del problema.
Solo che non riesco a capire se il C++ permetta l'utilizzo di una classe esclusivamente statica come lo permette il C#, nel senso, è possibile utilizzare metodi della suddetta classe senza crearne un istanza della stessa? se non ho capito male il namespace sarebbe piu adatto a questo utilizzo ma non credo supporti l'ereditarietà. |
No non e' permesso, il namespace sarebbe piu' adatto, e no, i namespace non supportano l'ereditarieta'.
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
il namespace è solo un contenitore di classi. |
il namespace sarebbe piu' adatto |
Non mi sembrate molto d'accordo.
In questo caso uso la classe esclusivamente perché mi permette di racchiudere piu metodi in un unico contenitore e che questi metodi possano accedere a variabili private, l'ereditarietà mi permetterebbe di mantenere metodi fissi modificando solo i puntatori hai registri di gestione dell'UART. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Cosa non ti va bene? il namespace può contenere anche altri namespace e metodi, ti aggrada di più così?
Ovviamente l'accesso a variabili private da un metodo statico è fantascienza.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Senza codice e senza sapere di più sullo scopo del problema è difficile dare ulteriori suggerimenti.
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Postato originariamente da TheDarkJuster:
Cosa non ti va bene? |
Postato originariamente da TheDarkJuster:
il namespace è solo un contenitore di classi. |
Postato originariamente da pierotofy:
Senza codice e senza sapere di più sullo scopo del problema è difficile dare ulteriori suggerimenti. |
Volevo creare una libreria per la comunicazione UART che possa essere adoperata su ogni AVR che abbia almeno un modulo UART. Espongo come l'avrei pensata in C# in quanto è il linguaggio OOP che padroneggio meglio:
Avrei creato una classe UART contenente tutti i metodi statici per la comunicazione seriale in questione, piu dei puntatori anch'essi statici che puntassero hai registri responsabili del funzionamento del componente HW. Questi puntatori sarebbero stati dichiarati come virtuali in modo che per ogni modulo UART presente sull'AVR in questione bastasse creare una nuova classe es UART0 che ereditasse da UART e che sovrascrivesse i suddetti puntatori. Quindi alla fine della fiera avrei avuto un unica classe UART che facesse da classe astratta e alcune classi figlie che gestissero i singoli componenti.
Adesso vedrò se optare per il namespace e per ogni modulo fare il copia incolla oppure creare una classe che durante l'inizializzazione venga accompagnata dagli indirizzi dei vari registri. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Ti ho risposto così perché non aveva senso dirti che contengono anche metodi, strutture e altri namespace, visto che non c'entra nulla con la tua domanda. Comunque la soluzione con la classe è la migliore.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Dichiara le funzioni generiche per la comunicazione UART in un namespace (senza classi).
Crea una classe astratta UART (con metodo normali, non statici) che accede alle funzioni definite qui sopra.
Crea delle sottoclassi UART0, UART1, ... che ereditano da UART.
Mi fermo qui perchè non ho ancora visto una singola riga di codice.
|
|