gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:25 24 4
gpt4 key购买 nike

我想在现代 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com