创建多类队列C++

Create a MultiClass Queue C++

本文关键字:C++ 队列 创建      更新时间:2023-10-16

是否可以为不同类型的对象创建一个队列,但界面相同?

例如,我有一个名为SensorItem的接口,以及4种类,SensorItemA ,传感器项B, 传感器项C ,传感器项D `

queue <SensorItem> cola;
void encolar(SensorItem* dato)
{
cola.push (*dato);
}
SensorItem* sacar()
{
SensorItem* d=cola.front();
cola.pop();
return d;
}

那是我的班级 队列(可乐) 在这里我尝试使用它

void main()
{
Cola c=new Cola();
TemperatureItem t=new TemperatureItem(3.25);
c.encolar(t);
ImuItem i=new ImuItem(3,4,8);
}   

我的语法有问题? 还是做不到?

C++中的多态性仅适用于引用和指针。 C++中的对象是对象,而不是引用。 如果您创建一个SensorItem它将始终是一个SensorItem,而不是TemperatureItemImuItem。 如果你有一个std::queue<SensorItem>,它的元素将永远是SensorItems,永远不会TemperatureItems或ImuItems

如果要创建从SensorItem派生的对象队列,则需要使用指向SensorItems 的指针队列:

#include <iostream>
#include <queue>
#include <memory>
struct SensorItem
{
virtual void doAThing() = 0;
virtual ~SensorItem() {}
};
struct TemperatureItem : SensorItem
{
void doAThing() { std::cout << "TemperatureItemn"; }
};
struct ImuItem : SensorItem
{
void doAThing() { std::cout << "ImuItemn"; }
};
class Cola
{
private:
std::queue<std::unique_ptr<SensorItem>> cola;
public:
void encolar(std::unique_ptr<SensorItem> dato)
{
cola.push(std::move(dato));
}
std::unique_ptr<SensorItem> sacar()
{
std::unique_ptr<SensorItem> d = std::move(cola.front());
cola.pop();
return d;
}
};
int main()
{
Cola c;
c.encolar(std::make_unique<TemperatureItem>());
c.encolar(std::make_unique<ImuItem>());
std::unique_ptr<SensorItem> item = c.sacar();
item->doAThing();
item = c.sacar();
item->doAThing();
}

住在科里鲁

在这里,我使用了std::unique_ptr来避免进行手动内存管理。 您可以使用原始SensorItem*,但我建议不要这样做。