gpt4 book ai didi

c++ - C++ 中工厂和动态分配的问题

转载 作者:太空狗 更新时间:2023-10-29 19:50:48 26 4
gpt4 key购买 nike

我有一个工厂可以在我的应用程序中构建具有最长生命周期的对象。它们有类型,比方说,ClientAClientB,它们依赖于 Provider(一个具有许多可能实现的抽象类),所以两个客户端都有对 Provider 作为成员的引用。

根据命令行参数,工厂选择Provider的一种实现,构造它(使用“new”),并将其传递给两者的构造函数客户。

工厂返回一个代表我的整个应用程序的对象。我的主要功能基本上是这样的:

int main(int argc, char** argv)
{
AppFactory factory(argc, argv);
App app = factory.buildApp();
return app.run();
}

buildApp 方法基本上是这样的:

App AppFactory::buildApp()
{
Provider* provider = NULL;

if (some condition)
{
provider = new ProviderX();
}
else
{
provider = new ProviderY();
}

ClientA clientA(*provider);
ClientB clientB(*provider);

App app(clientA, clientB);
return app;
}

因此,当执行结束时,将调用所有对象的析构函数,除了提供者对象(因为它是用“new”构造的)。

如何改进此设计以确保调用提供程序的析构函数?

编辑:澄清一下,我的意图是客户端、提供者和应用对象共享相同的生命周期。在所有答案之后,我现在认为客户端和提供者都应该在堆上分配其传递给 App 对象的引用,该对象将负责在它死亡时删除它们。你说呢?

最佳答案

共享所有权智能指针非常简单:

App AppFactory::buildApp()
{
boost::shared_ptr<Provider> provider;

if (some condition)
{
provider.reset(new ProviderX());
}
else
{
provider.reset(new ProviderY());
}

ClientA clientA(provider);
ClientB clientB(provider);

App app(clientA, clientB);
return app;
}

假设应用程序对象拥有客户端,并且客户端都共享一个提供程序。让客户拿一个shared_ptr<Provider>然后,而不是 Provider& .只要仍然有一个拥有提供者对象的 shared_ptr 拷贝,该对象就不会被释放。

最好不要复制 clientA 和 clientB,也不要通过按值返回来复制 app,而是将 clients 移到 app 中,并将 app 本身移到返回的对象中。这将在即将推出的 C++ 版本中成为可能。但目前,要么将它们设为指针(使用 shared_ptr),要么继续复制它们。另一种选择是使用 auto_ptr,它具有伪所有权转移语义。但是那个模板有一些固有的问题。所以你应该避免使用它。

关于c++ - C++ 中工厂和动态分配的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398641/

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