首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从基本对象(智能)指针复制派生对象

从基本对象(智能)指针复制派生对象
EN

Stack Overflow用户
提问于 2017-07-19 02:44:49
回答 1查看 289关注 0票数 1

假设我有两个类,BaseDerived,它们有一个变量来判断对象是否为Derived类型

代码语言:javascript
复制
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 to Base对象的std::set

代码语言:javascript
复制
std::set<std::shared_ptr<Base> > bases;
// Populate this set one way or another

我需要遍历该集合,并仅将Derived对象复制到另一组类似的Base共享指针中:

代码语言:javascript
复制
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有很多成员,所以这是不切实际的。

EN

回答 1

Stack Overflow用户

发布于 2017-07-19 02:52:03

有没有一种方法可以做到这一点,而不是复制构造函数,它为Derived的每个成员变量都有一个参数,而Base没有?

复制构造函数不需要每个成员变量都有参数。编译器也已经为您生成了一个。

你需要的是一个造型:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45174747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档