7

「イベント」クラスがあります。日付の処理方法により、このクラスを、イベントを保持する「UIEvent」クラスでラップし、イベントの日付を別の形式でラップする必要があります。

イベントからUIEventへの変換とその逆の変換を許可する最良の方法は何ですか?イベントを受け入れるためにUIEventの代入またはコピーコンストラクターをオーバーロードする(またはその逆)のが最善かもしれないと思いました。

4

2 に答える 2

21

私が考えることができる2つの簡単なオプションがあります。

最初のオプションは、あなたが説明するものです:他のタイプのオブジェクトを受け取るコンストラクターを作成します:

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));

2番目のオプションは、非メンバー変換関数を作成することです。

UIEvent EventToUIEvent(const Event&);

と使用std::transform

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

この方法の利点は、クラス間の直接結合が少ないことです。一方、クラスがとにかく自然に結合される場合もあります。その場合、最初のオプションは同じくらい意味があり、煩わしさが少なくなる可能性があります。

于 2010-04-14T01:26:09.980 に答える
5

Eventをに変換できる場合UIEvent(たとえば、 as パラメーターUIEventを取るコンストラクターがある場合Event)、次のように 1 つのベクターを別のベクターに割り当てます。

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()()上記の関数オブジェクトに好きなだけオーバーロードを追加できるので、同じ関数オブジェクトを他の変換に使用できます。

于 2010-04-14T02:43:38.670 に答える