|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
[C++] Classe astratta senza funzioni virtuali pure!
Supponiamo il seguente esempio:
Codice:
class ClasseAstratta {
protected:
int qualcosa;
public:
ClasseAstratta() {
// qualcosa...
}
void qualcosaDaFare() {
// qualcosa...
}
};
Codice:
class ClasseAstratta {
protected:
int qualcosa;
ClasseAstratta() {
// qualcosa...
}
public:
void qualcosaDaFare() {
// qualcosa...
}
};
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Codice:
class ClasseNonAstratta :
public ClasseAstratta
{
public:
ClasseNonAstratta() {}
};
ClasseAstratta ca = ClasseNonAstratta();
|
|
|
|
|
|
|
#3 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Quindi come dovrei fare?
Codice:
class ClasseAstratta {
protected:
int qualcosa;
ClasseAstratta() {
// qualcosa...
}
ClasseAstratta(const ClasseAstratta&) {
// qualcosa...
}
public:
void qualcosaDaFare() {
// qualcosa...
}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
si, a quel punto dovrebbe andare bene se non sto dimenticando qualcosa, solo che non credo che alcuno definirebbe quella una classe astratta.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Non vorrei essere di troppo, ma
Codice:
class ClasseAstratta abstract {
protected:
int qualcosa;
public:
ClasseAstratta() {
// qualcosa...
}
void qualcosaDaFare() {
// qualcosa...
}
};
|
|
|
|
|
|
#6 | |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
E' invece un'estensione del C++/CLI. Stai usando Visual Studio vero? |
|
|
|
|
|
|
#8 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Doh lo sospettavo in effetti, non ero riuscito a trovare riscontro su Google
![]() Comunque nel progetto dove l'ho provato non è abilitata alcuna estensione MS, l'ho fatto da 0... boh! Cmq credo che questo sia in realtà un non-problema: cose come abstract imo servono per permettere una visione intuitiva dell'uso del software... quindi fare una roba come nascondere i costruttori riuscirebbe più sviante che altro. Suggerirei di permetterne la creazione, ma dargli un nome molto esplicativo, tipo MiaClasseAstratta... e di spiegare bene il tutto nella documentazione (la quale è parte del programma quanto il codice). Eppoi, se la classe PUO' implementare tutti i suoi metodi, che ha di astratto?
Ultima modifica di Tommo : 26-09-2009 alle 01:32. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Per aggiungere un po' al discorso, una classe non astratta con tutti i costruttori protetti e' la modalita' standard per creare il pattern Singletone, quando vuoi essere sicuro che ci sia una ed una sola istanza della classe ovunque per l'applicazione
Ovvero puoi sempre costruire un oggetto di tale classe, ma ovviamente all'interno della classe stessa, ed al SingleTone e' proprio quello che serve. Codice:
public class Prova
{
protected void Prova()
{
// Fai eventualmente qualcosa
}
private static Prova MyUniqueInstance;
public static Prova GetSingleTone()
{
if (MyUinqueInstance==null)
MyUniqueInstance = new Prova();
return MyUinqueInstance;
}
}
....
//Da usarsi poi cosi'
...
Prova myProva = Prova.GetSingleTone();
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 26-09-2009 alle 08:51. |
|
|
|
|
|
#11 | |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Quote:
Spiego il mio problema. Ho una classe base che definisce dei metodi. Ho due sottoclassi che derivano da essa che aggiungono funzionalità. Tuttavia la classe base costituisce solo un raggruppamento delle caratteristiche comuni e non esiste nella realtà del sistema di interesse. E' utile però raggruppare le funzioni comuni ma è tuttavia errato e dannoso poter istanziare oggetti della classe base. D'altro canto non posso rendere astratta la classe perchè le caratteristiche comuni non hanno necessità di essere ridefiniti dalle sottoclassi e non esistono caratteristiche comuni per le quali sia possibile avere funzioni virtuali pure, a meno di non darne la medesima definizione in entrambe le sottoclassi. In tal senso la classe base deve essere astratta nel senso inteso in Java, ma sto lavorando in C++. Quindi un SingleTone carente della funzione membro che genera l'unica istanza della classe si tradurrebbe in un fantomatico "NullTone" che coinciderebbe con il mio scopo. Ma la domanda che vi ho posto non era volta a trovare un "pezzotto" era rivolta a trovare la soluzione più elegante, leggibile e soprattutto che evitasse a terzi di commettere azioni "illegali" rispetto alle regole del sistema reale che ho modellato! |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ma non puoi mettere anche una funzione virtuale pura inutile in classe base, oltre che le funzioni reali?
Se questo e' il modo sufficiente per evitare che il compilatore crei un'istanza della classe base hai raggiunto lo scopo.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Beh imo a sto punto c'è solo la "pezza"... oppure potresti spiegarlo bene altrove ma lasciare la classe non astratta. o magari tutte e due.
Cmq il nome è Singleton non SingleTone |
|
|
|
|
|
#14 | |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Quote:
Codice:
//! Do nothing: only to abstract the class... virtual void pureVirtual() = 0; Ultima modifica di Ikon O'Cluster : 26-09-2009 alle 13:33. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:47.




















