ich habe folgendes Problem: für die Netzwerkkommunikation möchte ich Clients vom Server accepten lassen und Worker erstellen, die sich um den Client kümmern. Dabei wollte ich zwei Klassen BaseServer und BaseWorker implementieren. Der Server muss die korrekte Worker-Klasse kennen, um die Worker von der richtigen (von BaseWorker abgeleiteten) Klasse zu erstellen. Daher habe ich mich dazu entschlossen, BaseServer einen Typparameter TWorker zu geben. Nun möchte ich, dass beim Erstellen des Workers ein Zeiger auf den zugehörigen Server mitgegeben wird, damit der Worker gegebenenfalls was am Server machen kann: z.B. sollte der Server den Worker-Thread nach dem Logout des Clients entfernen. Da dies vom Worker ausgeht (der Server weiß imho nicht wann das passiert, weil der Worker ja nur mit dem Client kommuniziert). Naja auf jeden Fall will ich BaseWorker einen Typparameter TServer mitgeben. Dann sieht der Quellcode nach meiner Idee so aus:
Code: Alles auswählen
#include <iostream>
template <typename TWorker>
class BaseServer {
public:
TWorker* worker; // eigentlich mehrere - hier vereinfacht
BaseServer() {
// Worker erstellen, der den Server kennt
this->worker = new TWorker(this);
}
};
template <typename TServer>
class BaseWorker {
public:
TServer* server;
BaseWorker(TServer* server): server(server) {}
};
// --- jetzt die eigentlichen Klassen ---
class Server;
class Worker: public BaseWorker<Server> {
public:
// Konstruktor wird ja nicht vererbt
Worker(Server* server): BaseWorker(server) {}
};
class Server: public BaseServer<Worker> {
public:
// Konstruktor wird ja nicht vererbt
Server(): BaseServer<Worker>() {}
};
int main() {
Server* server = new Server();
}
Jetzt frage ich mich: mache ich bei der Verwendung der Templates etwas falsch, oder geht das - so wie ich es will - gar nicht bzw. ist nicht sinnvoll --> Designfehler?test.cpp: In Konstruktor »BaseServer<TWorker>::BaseServer() [mit TWorker = Worker]«:
test.cpp:33:38: instanziiert von hier
test.cpp:9:13: Fehler: ungültige Umwandlung von »BaseServer<Worker>* const« in »Server*« [-fpermissive]
test.cpp:27:9: Fehler: Argument 1 von »Worker::Worker(Server*)« wird initialisiert [-fpermissive]
Ich hoffe ihr könnt mir helfen - wahrscheinlich habe ich das ganze etwas zu konfus erklärt .. naja mal schauen was ihr sagt

LG Glocke