2009-09-20 158 views
2

比方说,我有它接受客户端的模板一个简单的服务器,因为它的模板参数:C++模板和继承

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

和客户端的定义是这样的:

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

但我也想说,有类User继承自Clientclass User : public Client),所以我可以做Server<User>而不是Server<Client>。当构造Client时,类User显然需要通过Server<Client>作为参数。但是,在目前的实施中,这似乎是不可能的。

我该如何解决这个问题?

回答

4

这是怎么回事?

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

需要对现有代码进行一些重构,但这实际上是我想要的。万分感谢! – Chaosteil 2009-09-20 17:16:09

+0

事实上,析构函数可能会更好地被保护和非虚拟。这种设计几乎肯定不希望人们通过'Client *'删除用户的实例。 – 2009-09-20 17:23:37

+0

@onebyone:为什么不呢? – mmmmmmmm 2009-09-20 18:33:47