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

    [C++] classi base duplicate

    Stavo provando a mettere in pratica l'esempio che fa Stroustrup circa le classi base duplicate. Secondo quello che scrive, avendo delle classi
    codice:
    structA {
            A *next;
    };
    class B : public A { }; 
    class C : public A { }; 
    class D : public B, public C { };
    si dovrebbe poter scrivere
    codice:
    D *d = new D;
    d->B::A::next=0;
    d->C::A::next=0;
    per riferirsi ai due campi next che eredita D tramite B e C. Tuttavia, compilando quanto scritto con G++ ottengo un bell'errore 'A' is an ambiguous base of 'D' su entrambe le righe, mentre se scrivo d->B::next e d->C::next non ci sono problemi. Non riesco proprio a spiegarmelo, come mai le chiamate risultano ambigue quando non dovrebbero?

    Grazie, ciao
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

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

    Re: [C++] classi base duplicate

    Originariamente inviato da GreyFox86
    codice:
    D *d = new D;
    d->B::A::next=0;
    d->C::A::next=0;
    A me nemmeno compila scritto così.

    codice:
    D *d = new D;
    d->A::next=0;
    d->A::next=0;
    Invece così si.
    Il problema è che il compilatore non sa decidere a quale ramo di derivazione riferirsi e quindi blocca tutto. E uno dei casi dovuti all'ereditarietà cosidetta a rombo o a diamante.

    Se scrivi:
    codice:
    class B : virtual public A { }; 
    class C : virtual public A { }; 
    class D : virtual public B, virtual public C { };
    dovrebbe compilare (almeno a me lo fa)

    Qui c'è una spiegazione migliore
    http://www.eptacom.net/pubblicazioni.../antimorf.html

  3. #3
    Grazie per la risposta a quest'ora

    Non compilano neppure a me, l'errore che ho incollato in italico lo da G++ appunto

    Il punto è che il compilatore per quanto ne so dovrebbe essere in grado di capire quale ramo seguire, visto che lo sto indicando in modo completo con C::A::next: è il campo next dentro all'A che sta in C.
    Un caso ambiguo sarebbe d->A::next, questo si non si può risolvere visto che non si sa di quale dei due A a disposizione stiamo parlando.
    Le classi basi virtuali di cui parli tu sono un'altra cosa, ora mi interessava particolarmente capire perchè g++ mi impedisce di compilare qualcosa che secondo Stroustrup dovrebbe funzionare benissimo.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  4. #4
    Ho scoperto che il libro era una vecchia edizione, la nuova è stata corretta da d->C::A::next a d->C::next.
    Sarebbe interessante sapere se si sia trattato di un errore del testo o di un cambio di rotta del linguaggio, anche se per quanto riguarda il lato tecnico mi accontento di sapere questo.

    Ciao
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

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.