c++ - 共享从属对象
问题描述
我有一个模板类Foo
,它有一个方法,barMethod
需要一个Bar
对象。我可以让每个单独的Foo
对象根据需要创建Bar
对象,但我不想这样做,因为它会很慢,而且很有可能不同Foo
的对象可以使用相同的对象Bar
对象。
鉴于此,我想要一个BarManager
具有现有对象集的Bar
对象。然后Foo
对象可以要求它Bar
对象,如果已经存在合适的对象,则管理器将简单地返回它。如果不是,经理将创建一个新的并返回它。
在我看来,实施“经理”方法存在两个问题。
- 经理必须是一个全局变量,我不想这样做。
BarManager
并且Bar
都是模板类,所以即使我要让管理器成为全局变量/对象,我也不确定它是如何工作的。我想我可以将全局变量设为 void * 并在它被取消引用到适当的模板类时将其强制转换,但这看起来真的很难看。
必须有一种不那么难看的方法来做到这一点(也许使用auto
指针?)。它是什么?
编辑:该软件是我(可能还有其他人)稍后将使用的库的一部分,这就是为什么类被模板化并且模板类型不是先验的。另外,我想让 的用户尽可能简单Foo
,所以我不希望调用者必须对BarManager
or做任何事情Bar
(例如,实例化BarManager
并提供对 each 的引用Foo
)。
解决方案
如果你:
BarManager
在编译时知道具体的类型。- 不希望 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;
}
推荐阅读
- android - 如何通过脚本与安卓设备交互?
- r - 如何将循环绘图打印成单个 pdf /多个 pdf 文件
- r - 为 ggplot 添加标题
- python - 如何将两个不等式答案合并到同一行
- windows - 我如何知道调用了哪个 Windows API 版本?
- javascript - ReferenceError: __dirname 未定义
- mysql - java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:YES)Spring boot
- logging - 我无法再从 Google Apps 脚本中找到日志(由 Logger 创建)
- java - 找不到合适的驱动程序(Postgres JDBC):java.sql.SQLException:没有找到适合 jdbc:postgresql://rds-service:5432/postgres 的驱动程序
- android - 在android中单击按钮时如何在单词之间切换