c++ - 将子类保存在父 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);
}
当我从代码中的某个地方实例化时(取决于我可能正在处理的脚本Card
或Ticket
):
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
所以它应该可以被铸造。
解决方案
如果这是所有相关代码,那么
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>(...,..., ..., ...);
推荐阅读
- python - 如何在 Pandas 中确定在给定方程的情况下哪些列的行值会产生最终的真值
- pine-script - 查找最近的先前较高枢轴点,然后查找从那时起直到当前价格的最低枢轴点(松树)
- reactjs - 将 websocket 与消息服务一起使用的最佳实践
- python - 即使我在同一个函数中正常创建了 Python 对象(双向链表),Python 对象也没有正常创建
- r - 使用 Rstudio Cloud 进行多级分析
- django - django 中的 coockie 和会话
- javascript - 不需要的空白移动视图 HTML/汉堡菜单大小
- java - java - 如何解决Java中list的静态函数构造函数的问题?
- angular - 将对象和密钥传递给 Angular 中的通用组件:T[K]
- reactjs - 如何在反应中的一个功能中多次更新状态