gpt4 book ai didi

c++ - 共享从属对象

转载 作者:太空狗 更新时间:2023-10-29 21:10:51 27 4
gpt4 key购买 nike

我有一个模板类 Foo,它有一个方法 barMethod,它需要一个 Bar 对象。我可以让每个单独的 Foo 对象根据需要创建 Bar 对象,但我不想这样做,因为它会很慢,而且很有可能不同Foo 对象可以使用相同的 Bar 对象。

鉴于此,我想要一个 BarManager 对象,该对象具有现有的 Bar 对象集。 Foo 对象可以向它请求 Bar 对象,如果合适的对象已经存在,管理器将简单地返回它。如果没有,经理会创建一个新的并将其退回。

在我看来,实现“经理”方法存在两个问题。

  1. 经理必须是一个全局变量,我不希望这样做。
  2. BarManagerBar 都是模板类,所以即使我要让管理器成为全局变量/对象,我也不确定它会如何工作。我想我可以使全局变量成为 void * 并在它被取消引用到适当的模板化类时转换它,但这看起来真的很难看。

必须有一种不那么丑陋的方法来做到这一点(也许使用 auto 指针?)。这是什么?

编辑:该软件是我(可能还有其他人)稍后将使用的库的一部分,这就是类被模板化并且模板类型先验未知的原因。另外,我想让 Foo 的用户尽可能简单,所以我不希望调用者必须对 BarManagerBar 做任何事情(例如实例化 BarManager 并提供对每个 Foo 的引用)。

最佳答案

如果你:

  1. 在编译时知道BarManager的具体类型。
  2. 不希望 Foo 的任何用户知道这种内部机制。

然后您可以让所有 Foo 类将此 BarManager 作为 static(绝对不是全局变量)

template <typename T>
class Bar{};

template <typename T>
class BarManager;

template <typename T>
class Foo
{
private:
static BarManager<T>& GetBarManager()
{
static BarManager<T> managerInstance;
return managerInstance;
}

public:
void barMethod()
{
auto& bar = GetBarManager().GetBarInstance();

// Do something with `bar`
}
};

template <typename T>
class BarManager
{
public:
Bar<T>& GetBarInstance()
{
// Replace with cacher implementation:
static Bar<T> dud;
return dud;
}
};

int main()
{
Foo<int> foo;
foo.barMethod();

return 0;
}

关于c++ - 共享从属对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52408932/

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