首页 > 解决方案 > 共享从属对象

问题描述

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

鉴于此,我想要一个BarManager具有现有对象集的Bar对象。然后Foo对象可以要求它Bar对象,如果已经存在合适的对象,则管理器将简单地返回它。如果不是,经理将创建一个新的并返回它。

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

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

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

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

标签: c++c++11templates

解决方案


如果你:

  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;
}

推荐阅读