Classi annidate

di il
15 risposte

Classi annidate

Buongiorno,

qualcuno conosce una situazione (o più situazioni) in cui conviene implementare una classe annidata privata?

Grazie

15 Risposte

  • Re: Classi annidate

    Ciao,
    qui trovi un esempio molto semplice.
  • Re: Classi annidate

    Grazie, quando avrò un po' di tempo ci rifletterò sopra.
  • Re: Classi annidate

    Ho provato a fare una classe:
    
    
    class Esterna {
    private:
    	class Interna {
    	public:
    		Interna() {y = 8;}
    	private:
    		int y;
    	};
    	Interna* interna;
    public:
    	Esterna() {
    		interna = 0;
    	}
    	Interna* getInterna(){
    		Interna inte();
    		interna = &inte;
    		return interna;
    	}
    };
    
    
    ma il compilatore mi dà l'errore "cannot convert ‘Esterna::Interna (*)()’ to ‘Esterna::Interna*’ in return". Non capisco perché secondo lui getInterna restituisca un puntatore a funzione.
  • Re: Classi annidate

    Perché hai usato le parentesi in

    Interna inte;


    ?
  • Re: Classi annidate

    oregon ha scritto:


    Perché hai usato le parentesi in

    Interna inte;


    ?
    Ah giusto! Avevo usato le parentesi per chiamare il costruttore senza argomenti, non mi ricordo con quale compilatore si faceva così. Adesso non dà più l'errore!
  • Re: Classi annidate

    No ... non penso esista un compilatore che chiami il costruttore così ...

    E comunque occhio ... perché stai restituendo l'indirizzo di un oggetto che è stato distrutto ... che pensi di potere ottenere dopo se non un crash?
  • Re: Classi annidate

    oregon ha scritto:


    E comunque occhio ... perché stai restituendo l'indirizzo di un oggetto che è stato distrutto ... che pensi di potere ottenere dopo se non un crash?
    Hai ragione. Devo riflettere un po' sulle classi annidate.
  • Re: Classi annidate

    In realtà l'errore che hai fatto non è legato alle classi annidate ma è più generale ed è relativo al ciclo di vita degli oggetti/variabili.
  • Re: Classi annidate

    oregon ha scritto:


    In realtà l'errore che hai fatto non è legato alle classi annidate ma è più generale ed è relativo al ciclo di vita degli oggetti/variabili.
    Sì sì lo so, ed è un errore che normalmente non faccio. Mi sono perso nelle classi annidate e ho trascurato altre cose come il meccanismo di creazione e distruzione degli oggetti.
  • Re: Classi annidate

    Ho fatto così:
    
    
    class Esterna {
    private:
    	class Interna {
    	public:
    		Interna() {y = 8;}
    		void sety(int n) {y = n;}
    		int gety() {return y;}
    	private:
    		int y;
    	};
    	Interna* interna;
    public:
    	Esterna() {
    		interna = new Interna;
    	}
    	Interna* getInterna(){
    		return interna;
    	}
    };
    
    
    e funziona. Però la domanda che mi viene adesso è: per ogni istanza della classe esterna, ci può essere una sola istanza (o comunque un numero fissato a priori in base al numero di puntatori come attributi privati) della classe interna? E' un dato di fatto o c'è qualche "trucco" per evitare questo?

    Grazie
  • Re: Classi annidate

    E perché mai?

    Puoi allocare dinamicamente quante istanze vuoi ...
  • Re: Classi annidate

    oregon ha scritto:


    E perché mai?

    Puoi allocare dinamicamente quante istanze vuoi ...
    Sì infatti la soluzione al problema mi è venuta in mente un secondo dopo aver pubblicato il messaggio.
  • Re: Classi annidate

    In realtà non è un problema che dipende dalle classi annidate ...

    Per qualsiasi classe puoi usare un puntatore e allocare un vettore di oggetti con un puntatore, o un vettore di dati primitivi ... Insomma roba da C++ di base ...
  • Re: Classi annidate

    oregon ha scritto:


    In realtà non è un problema che dipende dalle classi annidate ...

    Per qualsiasi classe puoi usare un puntatore e allocare un vettore di oggetti con un puntatore, o un vettore di dati primitivi ... Insomma roba da C++ di base ...
    Sì ma qui la situazione è opposta, non è che posso, devo. Perché controllando la creazione di un'istanza della classe interna con una funzione della classe esterna, se allocassi nello stack all'uscita della funzione della classe esterna l'istanza della classe annidata verrebbe distrutta (errore che ho fatto nel codice postato sopra). Quindi, essendo costretto ad allocare in memoria libera, sono costretto a mettere come attributo un puntatore.
Devi accedere o registrarti per scrivere nel forum
15 risposte