Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] Basi: Il corretto utilizzo dell'ereditarietà

    Salve a tutti

    Lavorando su un progetto mi è venuta in mente questa domanda:

    E' corretto usare l'ereditarietà per sfruttare funzioni di un'altra classe?

    Sui libri ho letto sempre che per "correttezza" le classi ereditate devono avere in qualche modo un affinità. Spesso gli esempi classici sono: classe veicolo, classe ereditata "minivan" ecc..

    Insomma qualcosa di generico in superficie che viene ereditato da qualcosa di specifico.

    Ma è corretto usarla fuori da questo modo? Ad esempio, io ho una classe che mi gestisce lo scambio dati mysql, allo stesso tempo, ho altre classi che la sfruttano, tipo... agenda, allarme ecc..

    Di norma dentro le classi "Agenda" o "Allarme" creavo un oggetto mysql e poi facevo quello che dovevo fare, ma oggi pensavo: se Agenda o Allarme ereditassero le funzioni pubbliche di mysql (esempio: "class Agenda : private Mysql") sarebbe giusto? (so che funziona, ma volevo sapere se è sbagliato usarla in questo modo)

  2. #2
    In linea di massima è errato. Una classe eredita da un'altra se è una sua specializzazione, mentre se se ne deve semplicemente servire ne avrà un'istanza come membro privato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Perfetto quindi se dentro alarm devo usare una funzione della classe mysql, semplicemente mi basta creare un oggetto tipo:

    mysql obj;
    obj.nomefunzione();

  4. #4
    Originariamente inviato da Bloodxyz
    Perfetto quindi se dentro alarm devo usare una funzione della classe mysql, semplicemente mi basta creare un oggetto tipo:

    mysql obj;
    obj.nomefunzione();

    Si.


    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Al massimo ti suggerirei di usare un puntatore, se questa classe per l'accesso a mysql fosse molto grossa e avessi tanti oggetti che la sfruttano.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  6. #6
    Originariamente inviato da Ippo343
    Al massimo ti suggerirei di usare un puntatore, se questa classe per l'accesso a mysql fosse molto grossa e avessi tanti oggetti che la sfruttano.
    Uno smart pointer con reference counting (ad esempio lo shared_ptr di boost/C++0x) in tal caso sarebbe l'ideale.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Veramente non sono così avanzato da conoscere uno smart pointer con reference counting è da poco che lavoro sul c++

    Per quanto riguarda il puntatore dovrebbe essere così?

    mysql obj = new mysql;
    obj->nomefunzione();

    ma conviene sempre usare i puntatori per richiamare classi?



    Perchè io di norma utilizzo sempre il primo metodo, ossia:

    mysql obj;
    obj.nomefunzione();

  8. #8
    Originariamente inviato da Bloodxyz
    Veramente non sono così avanzato da conoscere uno smart pointer con reference counting è da poco che lavoro sul c++
    Dato che semplificano molto il lavoro in diverse occasioni, ti consiglio di darci un'occhiata.
    Per quanto riguarda il puntatore dovrebbe essere così?

    mysql obj = new mysql;
    obj->nomefunzione();

    ma conviene sempre usare i puntatori per richiamare classi?
    No. In linea di massima, se il ciclo di vita di obj corrisponde a quello dell'oggetto che lo contiene conviene dichiararlo semplicemente come membro, in modo che venga costruito e distrutto assieme all'oggetto-padre. Crearlo tramite puntatore conviene solo se deve essere condiviso tra più oggetti distinti (nel qual caso appunto per gestirne il ciclo di vita conviene il reference counting, meglio se automatizzato tramite smart pointer) oppure se l'oggetto è molto grosso e pertanto si vuole evitare di allocarlo sullo stack (e in questo caso conviene usare uno smart pointer tipo scoped_ptr/unique_ptr, in modo da automatizzarne il rilascio quando l'oggetto padre viene distrutto).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.