Stabilire una connessione tra classe genitore e figlio

0

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 in addChild()
  • vuole che entrambe le classi condividano un qualche tipo di classe di base composita. Dovrebbero rimanere in eredità non correlate.
posta hllnll 14.05.2014 - 11:01
fonte

1 risposta

1

Un approccio abbastanza standard sarebbe rendere Client::setManager protetto e dichiarare Manager::addClient come una funzione amico in Client . Ciò consentirà l'accesso di Manager::addClient a tutti i membri privati e protetti di Client , non solo Client::setManager , ma è più incapsulato in generale di un pubblico Client::setManager .

Vedi anche:

risposta data 31.10.2014 - 02:37
fonte

Leggi altre domande sui tag