Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Samsung rinnova la serie pieghevole di punta con Galaxy Z Fold8 Ultra: pannello interno da 8 pollici quasi senza piega, cerniera Flex Titanium, Snapdragon 8 Elite Gen 5 for Galaxy e batteria finalmente da 5.000 mAh. Prezzo italiano da 2.299 a 2.899 euro. Tra colorimetro, benchmark reali e giorni di uso quotidiano, ecco dove questo pieghevole convince e dove il nome Ultra fatica ancora a trovare piena giustificazione
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
La nuova Insta360 X6 introduce sensori Sony da 1/1.1" e un SoC Triple AI a 4nm. Analizziamo le riprese 8K, il primo Dolby Vision nativo a 10-bit nel settore sferico e l'innovativo flusso di lavoro diretto sulla futura versione 22 di DaVinci Resolve.
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Dopo due settimane trascorse al volante della Dacia Spring 2026 possiamo raccontarvi tutto, dalle novità di motore e batteria, fino ai consumi in tutti le situazioni, compresa l'autonomia reale ad alta velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-09-2009, 16:06   #1
Ikon O'Cluster
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...
    }
};
Non è astratta perchè va definita necessariamente una funzione virtuale pura, contrariamente al JAVA... Tuttavia se per classe astratta si considera la sua sola caratteristica di non istanziabilità allora questa definizione:

Codice:
class ClasseAstratta {
protected:
   int qualcosa;

    ClasseAstratta() {
        // qualcosa...
    }

public:

    void qualcosaDaFare() {
        // qualcosa...
    }
};
La reputate valida? L'assenza di costruttori pubblici è possibile al fine di evitare l'istanziazione?
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 19:52   #2
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Ikon O'Cluster Guarda i messaggi
L'assenza di costruttori pubblici è possibile al fine di evitare l'istanziazione?
no:
Codice:
class ClasseNonAstratta :
	public ClasseAstratta
{
public:
	ClasseNonAstratta() {}
};

ClasseAstratta ca = ClasseNonAstratta();
edit - o meglio, sarebbe possibile se tu i costruttori pubblici li avessi levati proprio tutti, ma hai lasciato il costruttore di copia.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 20:16   #3
Ikon O'Cluster
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...
    }
Così???
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 20:52   #4
fero86
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.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 21:08   #5
Tommo
Senior Member
 
L'Avatar di Tommo
 
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...
    }
};
E' sintassi valida C++ che produce una classe astratta. Almeno a me funziona
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 21:24   #6
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Non vorrei essere di troppo, ma

Codice:
class ClasseAstratta abstract {
protected:
   int qualcosa;

public:

    ClasseAstratta() {
        // qualcosa...
    }

    void qualcosaDaFare() {
        // qualcosa...
    }
};
E' sintassi valida C++ che produce una classe astratta. Almeno a me funziona
davvero???????????????????????????????
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 22:59   #7
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Non vorrei essere di troppo, ma

Codice:
class ClasseAstratta abstract {
protected:
   int qualcosa;

public:

    ClasseAstratta() {
        // qualcosa...
    }

    void qualcosaDaFare() {
        // qualcosa...
    }
};
E' sintassi valida C++ che produce una classe astratta. Almeno a me funziona
Ehm direi che abstract non rientra tra le keyword del C++.
E' invece un'estensione del C++/CLI.
Stai usando Visual Studio vero?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2009, 23:04   #8
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Ehm direi che abstract non rientra tra le keyword del C++.
E' invece un'estensione del C++/CLI.
Stai usando Visual Studio vero?
Mi sembrava strano e se non ho funzioni da rendere virtuali pure come faccio a generare una classe astratta?
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2009, 01:28   #9
Tommo
Senior Member
 
L'Avatar di Tommo
 
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?
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 26-09-2009 alle 01:32.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2009, 08:45   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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();
Eventualmente condito da regioni critiche per ambienti multithread.
__________________
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2009, 12:03   #11
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
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();
Eventualmente condito da regioni critiche per ambienti multithread.
Tuttavia l'assenza di getSingleTone permette di evitare anche quell'unica istanza. Di fatto in questo modo la classe è astratta se si considera astratta "una classe non istanziabile" alla maniera di JAVA. Per il C++ tuttavia la definizione non è rigorosa perchè vi è l'assenza di funzioni virtuali pure.

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!
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2009, 13:02   #12
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2009, 13:04   #13
Tommo
Senior Member
 
L'Avatar di Tommo
 
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
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2009, 13:29   #14
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Quote:
Originariamente inviato da Tommo Guarda i messaggi
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
Si è vero ho controllato il nome su "Design patterns" (Gamma) ed è Singleton... cmq al di là di questo inserire qualcosa tipo:

Codice:
//! Do nothing: only to abstract the class...
virtual void pureVirtual() = 0;
Mi sembra a dir poco una oscenità!!! A quel punto nascondo i costruttori e ci scrivo che l'ho fatto per evitare l'istanziazione!!!

Ultima modifica di Ikon O'Cluster : 26-09-2009 alle 13:33.
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing" Insta360 X6: Dolby Vision, 8K e montaggio "...
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli Due settimane con Dacia Spring 2026: novit&agrav...
AORUS GeForce RTX 5080 INFINITY WOOD 16G: una scheda video diversa dalle altre AORUS GeForce RTX 5080 INFINITY WOOD 16G: una sc...
Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla Hyundai Ioniq 9: dopo due settimane di test non ...
Apple TV punta ai diritti USA dell'Open ...
Download pirata di Odissea: attenzione a...
Condivisione Schermo di macOS sotto atta...
Debutta Freelander, il nuovo marchio di ...
Le migliori offerte Amazon di oggi: Appl...
Ecco l'auto della discordia, Voyah Passi...
Virgin Galactic posticipa la ripresa dei...
Apple AirPods Pro 3 a 199€: ANC evoluto,...
Insta360 Flow Pro a 65€: il gimbal per i...
IONIQ 3, parte da Izmit la produzione de...
Per il cofondatore di Arm l'IA non &egra...
Nove CEO dell'AI, nessuno si salva: il m...
OpenAI ha sciolto il team che valutava i...
Dreame Aqua10 Ultra, super calo di prezz...
Microsoft ritira Mico: dal 18 agosto Cop...
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: 17:17.


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