Я пытаюсь реализовать полиморфную очередь. Вот моя проба:Полиморфная очередь
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();
}
}
К сожалению, мне не удалось сделать работу полиморфного Queue с этим кодом по причине, я упоминал во втором comment.I догадке, мне нужно использовать смарт-указатели, но как ? Я открыт для любого улучшения моего кода или новой реализации полиморфной очереди.
Спасибо.
Это неправильно во многих отношениях, я даже не знаю с чего начать. Для начала: Почему вы сначала конвертируете ввод из UTF-8, а затем обратно в UTF-8? Почему не 'decodeFromTcpMessage()' бесплатная функция принимает строку и возвращает динамически выделенный запрос? Вы помещаете в очередь адрес _local автоматического объекта_ в очередь. (Ouch!) Вы всегда пытаетесь получить «LoginRequest», хотя вы также помещаете других в очередь. Вы получаете доступ к результату 'dynamic_cast', не проверяя, удалось ли отбрасывать. (Почему вы все равно кастовали? Что не так с виртуальными функциями?) ... – sbi
... У меня закончилось свободное пространство, так как комментарий допускает только 600 символов. Я предлагаю вам получить приличную книгу на C++. Например, см. Здесь: http://stackoverflow.com/questions/388242/. – sbi