c++ - 没有 unique_ptr 的现代 C++ 构建器模式

标签 c++ builder

我想在现代 C++ 中实现构建器模式。来自 Java 背景,这是我想效仿的东西:

// Usage
FooBuilder builder;
builder.setArg1(a);
builder.setArg2(b);
Foo foo = builder.build();

// Implementation
public class FooBuilder {
    // ...
    public Foo build() {
        return new Foo(a, b);
    }
}

典型的旧教科书只是建议人们像在 C++ 中那样做:

class FooBuilder {
    // ...
    Foo* build() {
        return new Foo(m_a, m_b);
    }
}

这显然不是一个好主意,因为处理原始指针可能容易出错。到目前为止我想到的最好的方法是手动使用 std::unique_ptr:

class FooBuilder {
    // ...
    std::unique_ptr<Foo> build() {
        return std::make_unique<Foo>(m_a, m_b);
    }
}

// Usage
auto fooPtr = builder.build();
Foo& foo = *fooPtr;
foo.someMethod();

更好,因为它不需要手动delete,这种到引用的两行转换很丑陋,而且,更重要的是,它使用堆分配,而简单的无构建器版本会只需简单的堆栈分配就完全可以:

Foo foo(..., ...); // <= on stack

有没有更好的方法来做到这一点,即没有 unique_ptr,或者为 Foo 使用某种堆栈分配?

最佳答案

没有理由必须在堆上分配以使用构建器模式。只需让您的 build() 方法直接返回 Foo 即可:

class FooBuilder {
public:
    Foo build() { // You may consider having a &&-qualified overload
        return Foo{ ..., ... };
    }
};

关于c++ - 没有 unique_ptr 的现代 C++ 构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48528134/

相关文章:

c++ - 生成随机字母数组并计算出现次数

java - 查询参数未映射

java - 有条件包含元素的生成器

c# - 为什么有人说 "Builder Pattern"比使用 Fluent 接口(interface)的扩展方法更好?

c++ - "Class"从模板类派生时没有命名类型

c++ - 如何在没有命名参数的情况下将可变数量的参数传递给c++中的函数

c++ - 提高 Basler 相机的 fps

c++ - 如果我在每个平台上使用相同的种子,随机结果会相同吗?

collections - Kotlin 中集合的构建器语法

java - 在 Java 中模拟命名参数