Pagina 1 di 1

problema tra classi innestate

Inviato: giovedì 7 giugno 2007, 17:13
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!

Re: problema tra classi innestate

Inviato: giovedì 7 giugno 2007, 17:38
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);  }

Re: problema tra classi innestate

Inviato: venerdì 8 giugno 2007, 11:24
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.

Re: problema tra classi innestate

Inviato: venerdì 8 giugno 2007, 11:26
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.

Re: problema tra classi innestate

Inviato: venerdì 8 giugno 2007, 11:28
da bite
Se te la cavi con l'Inglese, ti suggerisco di porre la domanda anche su comp.lang.c++ (accessibile da google gruppi).