首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态队列

多态队列
EN

Stack Overflow用户
提问于 2010-04-08 17:21:30
回答 3查看 1.1K关注 0票数 2

我正在尝试实现一个多态队列。这是我的试验:

代码语言:javascript
复制
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();
        }
    }

不幸的是,由于我在第二条评论中提到的原因,我无法使用这段代码来创建工作多态队列。我想,我需要使用智能指针,但如何使用呢?我对代码的任何改进或多态队列的新实现都持开放态度。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2010-04-08 17:55:25

您放置的指向QQueue的指针无效。如果你的QQueue包含指针,你需要在堆上创建你插入到它的每个对象,也就是调用new。此外,如果您不需要第一个创建的Request,请不要忘记释放它。

我认为你应该重写你的代码来:

代码语言:javascript
复制
...
if(request->requestType==REQUEST_LOGIN){
    delete request;
    request = new LoginRequest();
    request->tcpMessage=line.toUtf8();
    ...
}

有了这段代码,以后的dynamic_cast<LoginRequest*>就不会失败。

票数 2
EN

Stack Overflow用户

发布于 2010-04-08 17:34:18

从代码片段中,我可以立即看到Request的一个对象正在排队,稍后您会尝试将其转换为LoginRequest。dynamic_cast将理所当然地失败。您必须解析请求数据并创建从请求派生的适当类的对象。为此,我建议使用工厂模式。

票数 1
EN

Stack Overflow用户

发布于 2010-04-09 09:51:50

这也是一个使用工厂的好地方。

代码语言:javascript
复制
if(...)){
   Request *request = CreateRequest(message);
   requests.enqueue(request);
}

Request* request = requests.pop();
LoginRequest* login_req = dynamic_cast<LoginRequest*>(request);
if (login_req != NULL)
   whatever;

哪里

代码语言:javascript
复制
Request* CreateRequest(TcpMessage* message)
{
   TcpMessage* message = line.toUtf8();
   RequestType type = message->GetRequestType();
   Request* req = NULL;

   switch (type)
   {
   case REQUEST_LOGIN:
      req = new LoginRequest(message);
      break;
   etc.
   }

   delete message;
   return req;
}

...and然后,自然地,您的构造函数对消息做正确的事情,正确地初始化对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2598723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档