2017-06-16 9 views
0

可能です異なるオブジェクトタイプのキューを作成できますが、インターフェイスは同じですか?MultiClass Queue C++を作成する

例として、私は、SensorItemC SensorItem呼ばれるインターフェース、およびクラス、SensorItemA 、SensorItemB、 の4種類を持っている私のクラスのキュー(コーラ) ザッツ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

親クラス(Sensor Items)のキューを作成し、その親クラスの子でいっぱいにすることで多態性(継承)を実現できます。あなたがよく知らないのであればここで多形性を読んでください: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'は' void'ではなく 'int'を返します。何も返さずに' main'の終わりに来たら、コンパイラは 'return 0'を挿入します。 –

答えて

0

C++の多型は、参照とポインタでのみ機能します。 C++のオブジェクトはオブジェクトであり、参照ではありません。 SensorItemを作成すると、TemperatureItemまたはImuItemではなく、常にSensorItemになります。 std::queue<SensorItem>の場合、要素の値は常にSensorItemであり、決してTemperatureItemまたは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*を使用することもできますが、私はそれに対して助言します。

関連する問題