【问题标题】:Create a MultiClass Queue C++创建多类队列 C++
【发布时间】:2017-06-16 19:26:13
【问题描述】:

是否可以为不同类型的对象创建一个队列,但具有相同的接口?

例如,我有一个名为 SensorItem 的接口,以及 4 种 Class,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);
}   

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

【问题讨论】:

  • 您应该能够通过创建父类(传感器项)的队列并用该父类的子类填充它来通过多态性(继承)来实现这一点。如果您不熟悉,请在此处阅读多态性:cplusplus.com/doc/tutorial/polymorphism
  • 这正是我所做的,但是当我尝试推送项目时出现此错误 Invalid arguments ' Candidates are: void encolar(std::SensorItem *) 这是我的推送:TemperatureItem t=new温度项(3.25); c.encolar(*t); TemperatureItem 继承自 SensorItem :(
  • 无关:main 应该返回 int,而不是 void。如果你从main 的末尾不返回任何内容,编译器会为你插入一个return 0

标签: c++ interface queue


【解决方案1】:

C++ 中的多态性仅适用于引用和指针。 C++ 中的对象是对象,而不是引用。如果您创建SensorItem,它将始终是SensorItem,而不是TemperatureItemImuItem。如果您有std::queue&lt;SensorItem&gt;,它的元素将始终是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 << "TemperatureItem\n"; }
};

struct ImuItem : SensorItem
{
    void doAThing() { std::cout << "ImuItem\n"; }
};

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();
}

Live on Coliru

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

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 2020-09-22
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多