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
friend
per 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.