2009-09-20 193 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