Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Classi esclusivamente statiche
Forum - C/C++ - Classi esclusivamente statiche

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:47
Martedì, 16/09/2014
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.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:13
Martedì, 16/09/2014
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
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 4:57
Mercoledì, 17/09/2014
Testo quotato

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.

Testo quotato


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'.


Il mio blog: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 20:33
Mercoledì, 17/09/2014
Testo quotato

il namespace è solo un contenitore di classi.


Testo quotato

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.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:49
Mercoledì, 17/09/2014
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.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:04
Mercoledì, 17/09/2014
Senza codice e senza sapere di più sullo scopo del problema è difficile dare ulteriori suggerimenti.


Il mio blog: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 23:53
Giovedì, 18/09/2014
Testo quotato

Postato originariamente da TheDarkJuster:
Cosa non ti va bene?


Testo quotato

Postato originariamente da TheDarkJuster:
il namespace è solo un contenitore di classi.




Testo quotato

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.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 6:55
Venerdì, 19/09/2014
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.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:26
Venerdì, 19/09/2014
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.


Il mio blog: https://piero.dev
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo