gpt4 book ai didi

c++ - 使用什么类型的智能指针创建界面?

转载 作者:行者123 更新时间:2023-11-30 03:51:31 25 4
gpt4 key购买 nike

我有一些代码可以生成这样的小部件:

std::unique_ptr<Widget1> Widget1::Create()
std::unique_ptr<Widget2> Widget2::Create()

现在我有另一段代码需要使用Widget1Widget2 .我希望它具有类似的界面,但将小部件作为输入。

std::unique_ptr<Widget3> Widget3::Create(<?> Widget1, <?> Widget2)

在内部,Widget3应包含引用,例如

class Widget3
{
public:
std::unique_ptr<Widget3> Create(<?> Widget1, <?> Widget2)
{
_widget1 = Widget1;
_widget2 = Widget2;
}
void doSomething()
{
std::cout << _widget1->hello() << _widget2->hello();
}
private:
<?> _widget1, _widget2
};

现在我考虑使用 std::shared_ptr对于 <?>因为这似乎是最理智的。但是...我对如何应该传递它感到困惑?

想法?

最佳答案

这里的技巧是“关注点分离”。

对象的生命周期与其实现是一个单独的问题。

shared_ptrunique_ptr 控制生命周期。小部件n 个对象 事情。

如果您尊重代码设计中的关注点分离,您的生活将会很幸福,您的程序永远不会出错,您的同事也会喜欢您:

#include <iostream>
#include <memory>
#include <string>

struct Widget1 {
std::string hello() { return "widget1"; }
};

struct Widget2 {
std::string hello() { return "widget2"; }
};

struct Widget3 {
// Widget3 objects share their components. This is now documented in the interface here...
Widget3(std::shared_ptr<Widget1> widget1, std::shared_ptr<Widget2> widget2)
: _widget1(std::move(widget1))
, _widget2(std::move(widget2))
{
}

void doSomething()
{
std::cout << _widget1->hello() << _widget2->hello();
}
private:
std::shared_ptr<Widget1> _widget1;
std::shared_ptr<Widget2> _widget2;
};

using namespace std;

auto main() -> int
{
// make a unique Widget3
auto w1a = make_unique<Widget1>();
auto w2a = make_unique<Widget2>();
// note the automatic move-conversion from unique_ptr to shared_ptr
auto w3a = make_unique<Widget3>(move(w1a), move(w2a));

// make unique widget3 that uses shared components
auto w1b = make_shared<Widget1>();
auto w2b = make_shared<Widget2>();
auto w3b = make_unique<Widget3>(w1b, w2b);

// make shared widget3 that shares the same shared components as w3b
auto w3c = make_shared<Widget3>(w1b, w2b);

return 0;
}

不需要使用静态::create 函数。它对对象的创建者强制执行内存模型。

如果你想强制执行一个内存模型(比如总是创建一个共享指针),请使用 shared-handle-pimpl 惯用语私下进行:

// Widget4 objects have shared-handle semantics.
struct Widget4
{
private:
struct impl {
std::string hello() const { return "hello4"; }
};

public:
Widget4()
: _impl { std::make_shared<impl>() }
{}

std::string hello() const {
return _impl->hello();
}

private:
std::shared_ptr<impl> _impl;
};

关于c++ - 使用什么类型的智能指针创建界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208977/

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