Classi annidate

di Anonimizzato15235 il
15 risposte
Buongiorno,

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

Grazie

15 Risposte

  • Ciao,
    qui trovi un esempio molto semplice.
  • Grazie, quando avrò un po' di tempo ci rifletterò sopra.
  • 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.
  • Perché hai usato le parentesi in

    Interna inte;


    ?
  • 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!
  • 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?
  • 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.
  • In realtà l'errore che hai fatto non è legato alle classi annidate ma è più generale ed è relativo al ciclo di vita degli oggetti/variabili.
  • 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.
  • 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
  • E perché mai?

    Puoi allocare dinamicamente quante istanze vuoi ...
  • 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.
  • 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 ...
  • 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