2016-04-29 88 views
0

我有一個包含類Event的對象的隊列。函數多態性與參考數據類型

std::priority_queue<Event> events; 

但事件只是實際事件的超類。 讓我們假設我們有以下類:

class Event{ 
    public: 
    void Action(){ 
     std::cout<<"do nothing"<<std::endl; 
    } 
}; 

class XEvent : public Event{ 
    public: 
    void Action(){ 
      std::cout<<"do x"<<std::endl; 
    } 

class YEvent : public Event{ 
    public: 
    void Action(){ 
      std::cout<<"do y"<<std::endl; 
    } 
}; 

,並在主要功能:

int main(){ 
    std::vector<Event> events; 
    events.push_back(XEvent x); 
    events.push_back(YEvent y); 
    Event e = events[0]; 
    e.Action(); 
} 

我想e.Action根據重寫版本的行爲。 (即「do x」)。

但是,輸出結果讓我「無所事事」。 有什麼建議嗎?

p.s.我實際上正在尋找一種方法來做到這一點,而不使用指針

+0

閱讀有關切片。該向量應該是'std :: vector 事件;'而不是。 –

回答

0

插入矢量複製元素。目標類型始終爲Event,作爲模板的參數給出,因此這會更改類型。

建議:

  • 使用std::function代替。這些可能正是你正在尋找處理事件的東西。
  • 改爲使用(智能)指針類型,以便可以存儲多態元素。
  • 改爲使用智能聯合/變體類型,例如Boost.Any或Boost.Variant(不知道他們中的任何一個現在是否標準化)。如上但所創建一個對象,該對象從類Event可以是應創建一個指針
0
class Event{ 
    public: 
    virtual void Action(){ 
     std::cout<<"do nothing"<<std::endl; 
    } 
}; 

使用虛擬功能;

int main(){ 
    std::vector<Event> events; 
    events.push_back(XEvent x); 
    events.push_back(YEvent y); 
    XEvent xe = events[0]; 
    Event* e = &xe; 
    e->Action(); 
} 

或實現投射物。

+0

這個解決方案的問題是,通常我不知道事件事件[i]會是什麼類型,所以我不能做XEvent xe = events [i]; – finaleblue

+0

使用演員操作符如事件* e = static_cast xe – CMLDMR

0

使用智能指針共享指針,嘗試休耕代碼:

#include<iostream> 
#include<vector> 
#include <memory> 

class Event{ 
    public: 
    virtual void Action(){ 
     std::cout<<"do nothing"<<std::endl; 
    } 
}; 

class XEvent : public Event{ 
    public: 
    void Action(){ 
      std::cout<<"do x"<<std::endl; 
    } 
}; 

class YEvent : public Event{ 
    public: 
    void Action(){ 
      std::cout<<"do y"<<std::endl; 
    } 
}; 
int main(){ 
    std::vector<std::shared_ptr<Event>> events; 
    events.push_back(std::make_shared<XEvent>()); 
    events.push_back(std::make_shared<YEvent>()); 
    std::shared_ptr<Event> e = events[0]; 
    e->Action(); 
    return 0; 
}