Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197

    [c++] ereditarieta e costruttori

    ho una classe "figura" e una classe "triangolo" in entrabi sono definiti i costruttori
    quando uso la classe triagolo viene richiamato prima il costruttore di "figura" e poi quello di "triangolo", è possibile fare in modo che il costruttore della classe base"figura" non venga richiamato?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    No

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da shodan
    No
    Invece forse si può

    Per la classe figura crea 2 costruttori: uno di default che non deve fare niente, e uno che prende un argomento fittizzio e gli fai fare la tua normale routine.
    Nel costruttore della tua classe derivata, fai in modo che chiami il costruttore di default, che non fa niente per definizione
    e cosi hai fatto.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il meccanismo di richiamo dei costruttori e distruttori è alla base del linguaggio e come tale non può essere bypassato.
    Anche se metti un costruttore vuoto nella classe base, esso verrà invocato in ogni caso. E viene invocato pure per primo.
    (Eventualmente un compilatore furbo potrebbe ottimizzare evitando la chiamata, ma non ci metterei la mano sul fuoco).

    Quindi alla domanda "è possibile evitare di richiamare un costruttore base" la risposta è no.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Questo sicuramente, però un costruttore che non fa niente e non richiamare proprio il costruttore...
    bhe il risultato è lo stesso no?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Altrimenti alloca la classe con malloc.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Originariamente inviato da XWolverineX
    Altrimenti alloca la classe con malloc.
    E questo come risolverebbe il problema? :master:
    Intendi fare una cosa del genere?
    codice:
    myClass * mC;
    mC = (myClass *) malloc(sizeof(myClass));
    È un suicidio: in questo modo bypassi tutti i costruttori (che, se ci sono, vuol dire che a qualcosa servono) e inizializzi tutti i campi della classe a valori sconosciuti (la malloc infatti restituisce un puntatore a memoria allocata, ma che non è detto che sia inizializzata a 0), con conseguenze imprevedibili.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465

    Re: [c++] ereditarieta e costruttori

    Originariamente inviato da afrappe
    ho una classe "figura" e una classe "triangolo" in entrabi sono definiti i costruttori
    quando uso la classe triagolo viene richiamato prima il costruttore di "figura" e poi quello di "triangolo", è possibile fare in modo che il costruttore della classe base"figura" non venga richiamato?
    E' una cosa contraria anche alla "logica" della ereditarieta'.

    Costruisci la classe triangolo in modo che non erediti da figura ...

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da MItaly
    E questo come risolverebbe il problema? :master:
    Intendi fare una cosa del genere?
    codice:
    myClass * mC;
    mC = (myClass *) malloc(sizeof(myClass));
    È un suicidio: in questo modo bypassi tutti i costruttori (che, se ci sono, vuol dire che a qualcosa servono) e inizializzi tutti i campi della classe a valori sconosciuti (la malloc infatti restituisce un puntatore a memoria allocata, ma che non è detto che sia inizializzata a 0), con conseguenze imprevedibili.
    Capisco, ma se l'intento è quello di non chiamare il costruttore della classe base, malloc è la soluzione giusta (forse anche l'unica possibile?)
    Per quanto riguarda la sua inizializzazione, si può fare una cosa del genere
    codice:
    myClass *mC = (myClass *) memset(malloc(sizeof(myClass),0,sizeof(myClass));
    Che risolve tutti i problemi che hai citato (credo).
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Se vedessi del codice simile, caccerei il programmatore ...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.