Supponi di avere due classi, una Manager che detiene un set di Client s e il Client contiene un riferimento al Manager .
class Manager {
public:
void addClient(Client* client) {
m_clients.push_back(client);
client->setManager(this);
}
private:
std::list<Client*> m_clients;
};
class Client {
public:
void setManager(Manager* manager) {
m_manager = manager;
}
private:
Manager* m_manager;
};
La caratteristica confusa e probabilmente pericolosa di questa API è che il client espone un metodo setManager () che può essere chiamato da chiunque, ma dovrebbe essere chiamato solo dal metodo Manager :: addClient ().
assert(manager->hasClient(this)) in setManager () impedirebbe le chiamate errate in fase di esecuzione, tuttavia preferirei una soluzione che non permetta all'utente di chiamare metodi che non dovrebbe chiamare.
Quale sarebbe una soluzione comune? Io non
- desidera utilizzare
friendper esporre tutti i membri del client a Manager in modo che possa stabilire la connessione binaria inaddChild() - vuole che entrambe le classi condividano un qualche tipo di classe di base composita. Dovrebbero rimanere in eredità non correlate.