Newsgroup: it.comp.lang.c++
Titolo: Ereditarietà di un enum

E' possibile "continuare" un enum in una classe ereditata?
class Ristorante
{
    enum Portate
    {
        INSALATA,
        PASTASCIUTTA,
        FRUTTA
    };
};
class RistoranteDiLusso : public Ristorante
{
    enum Ristorante::Portate
    {
        CAVIALE,
        SALMONE
    };
};
Il precedente esempio viene compilato correttamente dal VC6, ma i valori
definiti dal secondo enum ripartono da 0, invece di continuare quelli del
primo enum.
Ovviamente voglio evitare soluzioni del tipo:
    enum Portate
    {
        .....
        LASTPORTATA
    }
    enum Ristorante::Portate
    {
        CAVIALE = LASTPORTATA,
        ....
    }
Vorrei che venisse fatto tutto in automatico dal compilatore, se esiste un
modo.
Ciao
-----
Giovanni Bajo
Lead Programmer
Prograph Research S.r.l.
http://www.prograph.it

 E' possibile "continuare" un enum in una classe ereditata?
Non che io sappia.  D'altra parte, le enum sono arbitrarie
collezioni di costanti, tipo
    class Informatico {
        enum Bits {
            zero = 1,
            uno = 2,
            due = 4,
            tre = 8
        }
        //...
    };
    class LeadProgrammer: public Informatico {
    // come dovrebbe qui continuare l'enumerazione...?-)
    };
Alex

Direttamente con gli enum non credo proprio. Potresti provare con una
classe apposta:
class Portate {
  public:
    static const int PRIMO = 1;
    static const int SECONDO = 2;
  protected:
    static const int GUARDIA = 99;
};
class RistorantePortate : public Portate {
  public:
    static const int CAVIALE = GUARDIA + 1;
}
Non so sevale la pena, pero'
Ciao,
Nicola

 wrote in message
83b474$ri8$1...@serv1.iunet.it...

Er... a parte la battutina :), potrebbero esserci tanti modi... ad esempio,
partendo dall'ultimo elencato, o dal maggiore.


Nicola Musatti <Nicola....@ObjectWay.it> wrote in message
3859FD3A...@ObjectWay.it...

In questo modo potevo usare anche l'enum:
enum
{
  PRIMO, SECONDO, DOLCE, CONTORNO, ..... , LAST
};
enum
{
  CAVIALE=LAST, SALMONE, eccetra
}
L'obiettivo era appunto evitare il LAST.


Pensavo che l'obbiettivo fosse avere un unico tipo che estendesse
l'altro. Nel tuo esempio hai comunque due enum separati.
I valori di guardia possono essere brutti dal punto di vista estetico,
perche' ti costringono a mescolare rappresentazioni del dominio
applicativo con dettagli implementativi, ma sono estremamente pratici.
Ciao,
Nicola

 partendo dall'ultimo elencato, o dal maggiore.
Appunto, troppi modi (nessuno dei quali prevede quello
che il programmatore qui probabilmente vorrebbe,
cioe` continuare con la legge del raddoppio), quindi,
nel dubbio, il C++ non ne implementa nessuno:-).
Fuori di scherzo, le enum non sono certo un punto forte
del C++.  Considerale come collezioni di costanti intere,
e grosso modo non vai lontano.
Quello che desideri probabilmente si puo` fare a colpi
di template (e` stato provato che i template del C++
sono Turing-completi, cioe` puoi farci QUALSIASI
elaborazione compile-time), ma non e` probabile che
sia saggio e sensato farlo (se sei pagato da un
produttore di compilatore per fargli il test delle
parti piu` recondite dell'implementazione dei
template, oppure prendi la mazzetta da un qualche
psichiatra in proporzione ai clienti che gli procuri
facendo uscire di matto chi deve leggere il tuo
codice, le cose possono essere diverse:-).
Alex

 elaborazione compile-time),
Quindi d'ora in poi possiamo rispondere a qualsiasi messaggio di qualsiasi
tipo su qualunque argomento: "usa i template!" :)
Non mi viene in mente un pattern per sostiutire enum con template ... nel
tuo immenso sapere, ne conosci qualcuno?
Bye


 tuo immenso sapere, ne conosci qualcuno?
http://www.extreme.indiana.edu/~tveldhui/papers/Template-Metaprograms/meta-a
rt.html
e i vari link che trovi da li`, piu`, magari, l'articolo forse
piu` divulgativo che pubblico` il DDJ, cioe`
www.ddj.com/articles/1996/9608/9608d/9608d.htm
(e` sempre Veldhuizen naturalmente...:-).
Alex