2009-09-20 20 views
2

のは、私はそれがテンプレート引数だとしてクライアントを受け入れるテンプレートを持つ単純なサーバーがあるとしましょう:このようなC++のテンプレートと継承

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

とクライアントが定義されているもの:

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

しかし、私はまた、クラスUserClientclass User : public Client)から継承させるようにしたいので、Server<Client>の代わりにServer<User>を行うことができました。クラスUserは、Clientを構築するときに明らかにパラメータとして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

+0

実際、デストラクタはおそらく保護されていて仮想ではない方が良いでしょう。この設計はほとんどの場合、人々が 'Client *'を使ってUserのインスタンスを削除することを望んでいません。 –

+0

@onebyone:どうしてですか? – mmmmmmmm