2017-07-18 137 views
1

可以說我有兩個類,BaseDerived具有可變告訴對象是否爲Derived類型:從基礎對象複製派生對象(智能)指針

class Base { 
public: 
    Base() : is_derived(false) {} 
    bool is_derived; 
}; 

class Derived : public Base { 
public: 
    Derived() : is_derived(true) {} 
    int derived_only_member; 
}; 

我有的std::shared_ptr的一個std::setBase對象:

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

我有必要通過設置迭代和僅複製Derived物體插入肛門療法類似的一組Base共享指針:

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對象,我怎麼能複製它,這樣的副本有derived_only_member相同的值?

有沒有一種方法可以做到這一點,而沒有一個拷貝構造函數的參數爲​​每個成員變量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))); 
              // ^^^^^^^^^^^^^^^^^^^^^^
    } 
} 

注:

你甚至都不需要is_derived成員檢查從Base被衍生的實例。您可以使用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_only_member'與原相同的值'Derived'對象? –

+0

@Kai當然,它會的。 – user0042

相關問題