2017-06-16 34 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*,但我會建議反對它。