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!
problema tra classi innestate
Re: problema tra classi innestate
'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:
La soluzione più comune è quella di fornirglielo esplicitamente, ad esempio tramite il costruttore. Ad esempio:
Dopodiché dovresti poter scrivere:
Immagino che, nell'implementazione, la classe annidata non preveda un riferimento alla classe esterna.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.
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() {.....}
};
};
Codice: Seleziona tutto
template<class T>
tree<T>::nodo* tree<T>::Iteratore::A(){ B(outer->root); }
Re: problema tra classi innestate
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
Sì, ma non vedo alternative. Anzi, se trovi una soluzione più elegante, fammelo sapere.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.
Re: problema tra classi innestate
Se te la cavi con l'Inglese, ti suggerisco di porre la domanda anche su comp.lang.c++ (accessibile da google gruppi).
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti
