2009-09-20 8 views
2

Disons que j'ai un simple serveur avec un modèle qui accepte un client car il est un argument de modèle:C++ Modèles et héritage

template<class T> 
class Server<T>{ 
    Server(int port); 
} 

et quelque chose comme est défini client ceci:

class Client{ 
    Client(Server<Client> *server, // <-- 
      int socket); 
}; 

Mais Je veux aussi dire, avoir la classe User hériter de Client (class User : public Client), donc je pourrais faire Server<User> au lieu de Server<Client>. classe User doit évidemment passer Server<Client> en tant que paramètre lors de la construction Client. Cependant, avec la mise en œuvre actuelle, cela semble impossible.

Comment aborder ce problème?

Répondre

4

Que pensez-vous de cela?

template<class T> 
class Server<T>{ 
    Server(int port); 
}; 

template<class Derived> 
class Client { 
    Client(Server<Derived> *server, int socket); 
    virtual ~Client() {} // Base classes should have this 
}; 

class User : public Client<User> { 
}; 
+0

Requis un refactoring du code existant, mais c'était essentiellement ce que je voulais. Grand merci! – Chaosteil

+0

En fait, le destructeur serait probablement mieux protégé et non virtuel. Cette conception ne veut certainement pas que les gens suppriment des instances de l'utilisateur via un 'Client *'. –

+0

@onebyone: Pourquoi pas? – mmmmmmmm