2017-07-18 18 views
1

は、私は、オブジェクトがタイプDerivedであるかどうかを伝えるために、変数を持つ2つのクラス、BaseDerivedを考えてみましょう私はセットを反復処理する必要があり、あのにのみDerivedオブジェクトをコピーはベースオブジェクトから派生したオブジェクトをコピーする(スマート)ポインタ

std::set<std::shared_ptr<Base> > bases; 
// Populate this set one way or another 

Baseオブジェクトへstd::shared_ptr年代のstd::setBase共有ポインタのTHER同様のセット:

std::set<std::shared_ptr<Base> > copies; 
for(auto &b: bases) { 
    if(b->is_derived) { 
     copies.insert(/*Somehow copy the `Derived` object and assign a `std::shared_ptr<Base>` to it */); 
    } 
} 

私はBaseポインタを知っていればコピーはderived_only_memberに同じ値を持つように私はそれをコピーすることができますどのように、Derivedオブジェクトを指していますか?

Derivedにあり、Baseが持つすべてのメンバー変数の引数を持つコピーコンストラクタなしでこれを行う方法はありますか?私の実際のバージョンDerivedには多くのメンバーがいるので、これは実用的ではありません。

答えて

0

Derivedが持っているとBaseがないこと、すべてのメンバ変数の引数を持っているコピーコンストラクタなしでこれを行う方法はありますか?

コピーコンストラクタは、すべてのメンバー変数に引数を必要としません。コンパイラはすでにあなたのためにも生成します。

std::set<std::shared_ptr<Base> > copies; 
for(auto &b: bases) { 
    if(b->is_derived) { 
     copies.insert(std::make_shared<Derived>(static_cast<Derived>(*b))); 
              // ^^^^^^^^^^^^^^^^^^^^^^
    } 
} 

注:

あなたもBase由来しているインスタンスを確認するためにis_derivedメンバーを必要としないあなたはキャストがある必要なもの

。あなたは代わりにdynamic_castを使用することができます。

std::set<std::shared_ptr<Base> > copies; 
for(auto &b: bases) { 
    Derived* org = dynamic_cast<Derived*>(b.get()); 
    if(org) { 
     copies.insert(std::make_shared<Derived>(*org)); 
    } 
} 
+0

そしてコピーは、元の 'Derived'オブジェクトとして' derived_only_member'に対して同じ値を持つことになりますか? –

+0

@カイもちろん、そうです。 – user0042