将子类保存在父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);
}

现在,我有一个要保存TicketCard的队列。为此,我创建了一个名为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

这很奇怪,因为TicketRequest_manager的子代,所以它应该能够被广播。

如果这是所有相关代码,则

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>(...,..., ..., ...);

最新更新