problema tra classi innestate

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
lup0z
Prode Principiante
Messaggi: 110
Iscrizione: giovedì 11 gennaio 2007, 14:36

problema tra classi innestate

Messaggio da lup0z »

Ciao a tutti...provo ad esperre il mio problem che mi sa tenendo fermo con un progetto che ha una scadenza a dir poco importante.
Ho la seguente dichiarazione di classi:

template
class tree{
friend class Iteratore;
    private:
        class nodo{..........};
        ...
        nodo * root;
    public:
      class Iteratore{
      friend class tree;
          private:
              .....
              void B(nodo*);
          public:
                nodo * A() {.....}
      };
};
Ora, se faccio uan cosa simile:

template
tree::nodo* tree::Iteratore::A(){  B(root);  }

mi viene dato il seguente errore:
error: invalid use of nonstatic data member ‘tree::root’
(ovviamente ho un main.cpp dove provo la classe e il template usa un tipo int).

Perché mi da questo errore? Facendo delle prove, il problema sembra l'accessibilità a root. eppure ci sono le due dichiarazioni di amicizia!
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: problema tra classi innestate

Messaggio da bite »

'Iteratore' è una classe annidata e, anche se la dichiari friend, non ha particolari diritti di accesso sulla classe esterna 'tree' cui appartiene il membro 'root'. Stroustrup 2 ed. § r.9.7:
Member functions of a nested class have no special access to members of an enclosing class; they obey the usual access rules (§r.11). Member functions of an enclosing class have no special access to members of a nested class; they obey the usual access rules.
Immagino che, nell'implementazione, la classe annidata non preveda un riferimento alla classe esterna.
La soluzione più comune è quella di fornirglielo esplicitamente, ad esempio tramite il costruttore. Ad esempio:

Codice: Seleziona tutto

template<class T>
class tree{
friend class Iteratore;
    private:
        class nodo{..........};
        ...
        nodo * root;
    public:
       class Iteratore{
       friend class tree;
           private:
              tree * outer;
              .....
               void B(nodo*);
           public:
                Iteratore (tree * _outer) : outer (_outer) {}
                nodo * A() {.....}
       };
};
Dopodiché dovresti poter scrivere:

Codice: Seleziona tutto

template<class T>
tree<T>::nodo* tree<T>::Iteratore::A(){  B(outer->root);  }
lup0z
Prode Principiante
Messaggi: 110
Iscrizione: giovedì 11 gennaio 2007, 14:36

Re: problema tra classi innestate

Messaggio da lup0z »

Qual'ora dovessi usare l'iteratore all'estero della classe (come serve a me), dovrei per forza costruire l'iteratore con il costruttore ridefinito.
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: problema tra classi innestate

Messaggio da bite »

lup0z ha scritto: Qual'ora dovessi usare l'iteratore all'estero della classe (come serve a me), dovrei per forza costruire l'iteratore con il costruttore ridefinito.
Sì, ma non vedo alternative. Anzi, se trovi una soluzione più elegante, fammelo sapere.
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: problema tra classi innestate

Messaggio da bite »

Se te la cavi con l'Inglese, ti suggerisco di porre la domanda anche su comp.lang.c++ (accessibile da google gruppi).
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti