Una
classe amica viene dichiarata con l'accoppiata delle
keywords "
friend class". La classe designata come "amica" ha accesso a determinati campi o metodi di una determinata classe che sono definiti come
private e quindi inaccessibili alle altre classi.
Può essere utile in alcuni casi sempre stando attenti a non abusarne.
Ad esempio potrebbe essere utile quando hai un classe
Node e una classe
LinkedinList che deve accedere ai campi
private di
Node:
class Node
{
private:
int value;
Node *nextNode;
friend class LinkedList; //La classe LinkedList può usare e vedere i campi value e nextNode della classe Node.
};
Le
classi innestate invece sono classi definite all'interno di un'altra classe. Un esempio di uso è proprio un'alternavita all'esempio che ti ho fatto sopra. Nella fattispecie una classe innestata nell'esempio sopra può essere utile nei casi in cui vuoi nascondere i dettagli implementativi della
LinkedList, ad esempio senza rendere noto esplicitamente che usa una classe
Node. Rendendo quest'ultima innestata e private viene usata internamente dalla LInkedList e non visibile agli utilizzatori della LinkedList:
class LinkedList
{
public:
void addValue(int val);
void removeValue(int val);
/* vari altri metodi per gestire la lista */
private: //chi usa LinkedList non vede Node
class Node //Classe innestata
{
public: //LinkedinList può usare value e nextNode in quanto public
int value;
Node *nextNode;
};
Node head; //testa della lista
};
Ci sono tanti vari esempi che possono essere fatti, questo penso possa chiarire abbastanza le idee. L'importante è non abusarne ed usarle solo quando c'è effettivamente bisogno.