我有一個「事件」類。由於處理日期的方式,我們需要以「UIEvent」類包裝此類,該類包含Event,以及Event的另一種格式的日期。將一種類型的矢量分配給另一種類型的矢量
允許從事件轉換爲UIEvent並返回的最佳方式是什麼?我認爲重載UIEvent的賦值或複製構造函數以接受事件(反之亦然)可能是最好的。
我有一個「事件」類。由於處理日期的方式,我們需要以「UIEvent」類包裝此類,該類包含Event,以及Event的另一種格式的日期。將一種類型的矢量分配給另一種類型的矢量
允許從事件轉換爲UIEvent並返回的最佳方式是什麼?我認爲重載UIEvent的賦值或複製構造函數以接受事件(反之亦然)可能是最好的。
有兩個簡單的選項,我可以想到。
第一個選項將是您所描述的一個:創建一個構造函數的其它類型的對象:
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);
做這種方式的好處是,有類之間不那麼直接耦合。另一方面,無論如何,有時候班級自然會聯繫在一起,在這種情況下,第一種選擇可能同樣有意義,並且可能不那麼麻煩。
如果你可以轉換一個Event
到UIEvent
(例如,如果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()()
在上面的函數對象中,所以您可以使用相同的函數對象進行其他轉換。
哎呀,我應該在回答之前刷新我的頁面:p +1表示耦合點。 – wilhelmtell 2010-04-14 02:47:21