2017-06-16 85 views
0

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

作为实例,我有称为SensorItem的接口,并且4种类,SensorItemA ,SensorItemB, SensorItemC 的,SensorItemD '

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

它在我的语法错了吗?或者只是不可能做到这一点?

+1

你应该能够通过多态性(继承)实现这一点,方法是制作一个父类(传感器项目)的队列并用该父类的子项填充它。如果您不熟悉,请阅读多态性:http://www.cplusplus.com/doc/tutorial/polymorphism/ –

+0

这正是我所做的,但是当我尝试推送项目时出现此错误 无效参数' 候选人是: void encolar(std :: SensorItem *),这是我的推:TemperatureItem t = new TemperatureItem(3.25); c.encolar(* t); TemperatureItem继承自SensorItem :( –

+0

无关:'main'应该返回一个'int',而不是'void'。如果你没有返回任何东西而退出'main'的末尾,编译器会为你插入一个'return 0' 。 –

回答

0

C++中的多态性仅适用于引用和指针。 C++中的对象是对象,而不是引用。如果创建SensorItem,它将始终为SensorItem,而不是TemperatureItemImuItem。如果您有std::queue<SensorItem>,它的元素将始终为SensorItem s,从不TemperatureItem s或ImuItems

如果你想从SensorItem派生的对象的队列中,则需要使用指针的队列SensorItem S:

#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*,但我会建议反对它。