首页 > 解决方案 > 将子类保存在父 shared_ptr 的队列中

问题描述

想象一下下面的代码:

class Request_manager{
public:
    virtual ~Request_manager();
protected:
    explicit Request_manager(type0 start_time);
}

class Ticket : Request_manager{
public:
    Ticket(type1 rq, type2* dataserver,
           type3 tix, type4 start_time);
}

class Card : Request_manager{
public:
    Card(type5 xd, type6* people,
           type7 tr, type8 play_time);
}

现在,我有一个要保存的队列,Ticket并且Card. 为此,我创建了一个名为Tickets_Queue

class Tickets_Queue{
public:
        void push(std::shared_ptr<Request_manager> ticket);
}

当我从代码中的某个地方实例化时(取决于我可能正在处理的脚本CardTicket):

Tickets_Queue ticket_queue;
auto ticket = std::make_shared<Request_manager>(...,..., ..., ...);
ticket_queue_->push(ticket);

我得到类似的东西:

/usr/include/c++/5/bits/shared_ptr.h:635:39:   required from ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = dataserver::Request_manager; _Args = {dataserver::pointdata::Batch_request, dataserver::Data_interface*&, xxxxx::service::Service_ticket&, dataserver::System_time&}]’
data_interfaces/pointdata/Interface.cpp:48:72:   required from here
/usr/include/c++/5/ext/new_allocator.h:120:4: error: no matching function for call to ‘dataserver::Request_manager(dataserver::pointdata::Batch_request, dataserver::Data_interface*&, ubimet::service::Service_ticket&, dataserver::System_time&)’
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^
In file included from data_interfaces/Tickets_Queue.h:5:0,
                 from data_interfaces/pointdata/Interface.h:7,
                 from data_interfaces/pointdata/Interface.cpp:1:
data_interfaces/Request_manager.h:30:18: note: candidate: dataserver::Request_manager(dataserver::System_time)
         explicit Ticket(System_time start_time);
                  ^
data_interfaces/Request_manager.h:30:18: note:   candidate expects 1 argument, 4 provided
data_interfaces/Request_manager.h:24:11: note: candidate: constexpr dataserver::Request_manager::Request_manager(const Request_manager&)
     class Ticket {
           ^
data_interfaces/Request_manager.h:24:11: note:   candidate expects 1 argument, 4 provided

另一方面,如果我这样做:

auto ticket = std::make_shared<Ticket>(...,...,...,...);
ticket_queue_->push(ticket);

它告诉我:

no suitable user-defined conversion from "std::shared_ptr<Ticket>" to "std::shared_ptr<Request_manager>" exists

这很奇怪,因为Ticket它是一个孩子,Request_manager所以它应该可以被铸造。

标签: c++inheritancequeue

解决方案


如果这是所有相关代码,那么

auto ticket = std::make_shared<Request_manager>(...,..., ..., ...);

不可能工作:Request_manager 没有带四个参数的构造函数。

可以拥有一个多态 shared_ptrs 队列;但是,当您创建队列项时,您需要创建一个指向其中一种派生类型的共享指针并将其放入队列中,例如

std::shared_ptr<Request_manager> ticket = std::make_shared<Ticket>(...,..., ..., ...);

在上面。为使上述工作,Ticket 和 Card 必须公开继承自 Request_manager。如下

class Ticket : public Request_manager{
public:
    Ticket(type1 rq, type2* dataserver,
           type3 tix, type4 start_time);
}

class Card : public Request_manager{
public:
    Card(type5 xd, type6* people,
           type7 tr, type8 play_time);
}

...

std::shared_ptr<Request_manager> ticket = std::make_shared<Ticket>(...,..., ..., ...);


推荐阅读