首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >克隆智能指针与抽象工厂

克隆智能指针与抽象工厂
EN

Stack Overflow用户
提问于 2013-06-20 19:02:08
回答 1查看 489关注 0票数 0

我需要获取一些抽象类型的新实例,我想到的两件事是抽象工厂和克隆智能指针。哪一个看起来更好?工厂方法似乎更通用,但过于冗长,特别是当抽象对象嵌套时。克隆指针更紧凑,但看起来有点丑陋,因为我们需要创建一个“虚拟”对象,用作创建其他对象的模板。

代码语言:javascript
复制
class IObject {
public:
    virtual ~IObject() {}
};

class Foo: public IObject {
public:
    struct Config {};
    explicit Foo(const Config& config): config_(config) {}

private:
    Config config_;
};

抽象工厂:

代码语言:javascript
复制
class IObjectFactory {
public:
    virtual ~IObjectFactory() {}
    virtual std::unique_ptr<IObject> Create() const = 0;
};

class FooFactory: public IObjectFactory {
public:
    explicit FooFactory(const Foo::Config& config): config_(config) {}

    std::unique_ptr<IObject> Create() const {
        return std::unique_ptr<IObject>(new Foo(config_));
    }

private:
    Foo::Config config_;
};

void DoSomething(const std::shared_ptr<IObjectFactory>& factory) {
    std::vector<std::shared_ptr<IObject>> objects;
    for (int i = 0; i < 10; ++i) {
        objects.push_back(factory->Create());
    }
    // Do something with the created objects
}

int main() {
    auto factory = std::make_shared<FooFactory>(Foo::Config());
    DoSomething(factory);
}

克隆指针(one of the implementations):

代码语言:javascript
复制
template <typename T> class clone_ptr; // deep cloning smart pointer

void DoSomething(const clone_ptr<IObject>& object) {
    std::vector<clone_ptr<IObject>> objects;
    for (int i = 0; i < 10; ++i) {
        objects.push_back(object);
    }
    // Do something with the created objects
}

int main() {
    clone_ptr<IObject> object(new Foo(Foo::Config()));
    DoSomething(object);
}
EN

回答 1

Stack Overflow用户

发布于 2013-06-20 21:39:17

更简单的做法是做一些你没有提供的选项。向您的基本对象添加一个虚拟clone函数,并使用该函数克隆对象。

我不太明白你提供的两种方法是如何解决同一个问题的……指针方法很复杂才能正确,智能指针必须使用魔法来跟踪内部存储的真实类型,以便能够进行克隆(将魔法视为类型擦除)。如上所示的工厂要求您知道要克隆的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17211961

复制
相关文章

相似问题

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