J'essaie de mettre en œuvre une file d'attente polymorphe. Voici mon procès:File d'attente polymorphe
QQueue <Request *> requests;
while(...)
{
QString line = QString::fromUtf8(client->readLine()).trimmed();
if(...)){
Request *request=new Request();
request->tcpMessage=line.toUtf8();
request->decodeFromTcpMessage(); //this initialize variables in request using tcpMessage
if(request->requestType==REQUEST_LOGIN){
LoginRequest loginRequest;
request=&loginRequest;
request->tcpMessage=line.toUtf8();
request->decodeFromTcpMessage();
requests.enqueue(request);
}
//Here pointers in "requests" do not point to objects I created above, and I noticed that their destructors are also called.
LoginRequest *loginRequest2=dynamic_cast<LoginRequest *>(requests.dequeue());
loginRequest2->decodeFromTcpMessage();
}
}
Malheureusement, je ne parvenais pas à faire le travail polymorphes file d'attente avec ce code en raison de la raison pour laquelle je l'ai mentionné dans guess deuxième comment.I, je dois utiliser Smart-pointeurs, mais comment ? Je suis ouvert à toute amélioration de mon code ou à une nouvelle implémentation de la file d'attente polymorphe.
Merci.
C'est faux à bien des égards, je ne sais même pas par où commencer. Pour commencer: Pourquoi convertissez-vous d'abord l'entrée en UTF-8, puis revenez en UTF-8? Pourquoi 'decodeFromTcpMessage()' n'est pas une fonction libre qui prend une chaîne et renvoie une requête allouée dynamiquement? Vous mettez en file d'attente l'adresse d'un objet automatique local dans la file d'attente. (Aïe!) Vous essayez toujours de récupérer un 'LoginRequest', même si vous mettez aussi d'autres dans la file d'attente. Vous accédez au résultat de 'dynamic_cast' sans vérifier si les conversions ont réussi. (Pourquoi lancez-vous de toute façon? Quel est le problème avec les fonctions virtuelles?) ... – sbi
... J'ai manqué d'espace, car un commentaire ne permet que 600 caractères. Je vous suggère de vous procurer un livre décent en C++. Par exemple, voir ici: http://stackoverflow.com/questions/388242/. – sbi