2010-04-14 113 views
2

我有一個「事件」類。由於處理日期的方式,我們需要以「UIEvent」類包裝此類,該類包含Event,以及Event的另一種格式的日期。將一種類型的矢量分配給另一種類型的矢量

允許從事件轉換爲UIEvent並返回的最佳方式是什麼?我認爲重載UIEvent的賦值或複製構造函數以接受事件(反之亦然)可能是最好的。

回答

10

有兩個簡單的選項,我可以想到。

第一個選項將是您所描述的一個:創建一個構造函數的其它類型的對象:

struct UIEvent 
{ 
    UIEvent(const Event&); 
}; 

並使用std::copy從一個類型的載體複製元素的一個向量其他:

std::vector<Event> eventVector; 
std::vector<UIEvent> uiEventVector; 

std::copy(eventVector.begin(), eventVector.end(), 
      std::back_inserter(uiEventVector)); 

第二種選擇是將寫一個非成員轉換功能:

UIEvent EventToUIEvent(const Event&); 

,並使用std::transform

std::transform(eventVector.begin(), eventVector.end(), 
       std::back_inserter(uiEventVector), &EventToUIEvent); 

做這種方式的好處是,有類之間不那麼直接耦合。另一方面,無論如何,有時候班級自然會聯繫在一起,在這種情況下,第一種選擇可能同樣有意義,並且可能不那麼麻煩。

+0

哎呀,我應該在回答之前刷新我的頁面:p +1表示耦合點。 – wilhelmtell 2010-04-14 02:47:21

5

如果你可以轉換一個EventUIEvent(例如,如果UIEvent具有一個構造函數的Event作爲參數),則下面將一個向量分配到另一:

uievent_vector.reserve(event_vector.size()); 
uievent_vector.assign(event_vector.begin(), event_vector.end()); 

當然其他的方式如果轉換工作的話,周圍也會有效。

或者,您可以使用std::copy()獲得相同的效果。如果你不能在類接口中的一種方式進行轉換,然後寫一個函數,使轉換,然後使用std::transform()

struct to_uievent { 
    UIEvent operator()(const Event& e) { 
     // ... 
    } 
}; 

// ... 
    std::transform(event_vector.begin(), event_vector.end(), 
        back_inserter(uievent_vector), 
        to_uievent()); 

你可以,當然,如你所願的添加儘可能多的重載operator()()在上面的函數對象中,所以您可以使用相同的函數對象進行其他轉換。