0

我有 3 个接口类IVideo , IAudio , IGPIO和其他三个将实现这些接口的类:Video_impl , Audio_impl , GPIO_impl.

到目前为止,事情很简单。

但是,我希望所有这些对象都是单例的。以下是问题:

抽象一个 Interface 是个好主意ISingleton,以便Video_impl , Audio_impl , GPIO_impl(或IVideo , IAudio , IGPIO?)可以继承它?

我正在考虑以下列方式实现它。推荐吗?我认为必须有更好的方法。

//Isingleton.hpp
template <class T>
class ISingleton
{
public:
virtual T *getInstance() = 0;

};

class IGPIO
{
public:
virtual int SelectAudioInput() = 0;
};

class GPIO_impl : public IGPIO, public ISingleton<IGPIO>
{
public:
    IGPIO *getInstance();
    int SelectAudioInput() ;
private:
    IGPIO *instance;
};
4

3 回答 3

3

我建议阅读 Alexandrescu 的“现代 C++ 设计”。在其中,他设计了一个成熟的单例模板,并思考了很多问题,比如什么时候销毁,销毁后是否应该复活,因为在销毁其他单例时需要它,和所有的好东西。

于 2009-09-24T09:43:35.083 回答
1

我看不到这里的好处。您仍然必须在派生类中实现 getInstance() 方法。所以你已经引入了模板和多重继承,但并没有真正获得任何东西。我能看到的唯一小收获是您让所有单身人士共享一个通用方法,但这是一种常见的模式,我认为这不是真正的收获。

于 2009-09-24T09:33:54.463 回答
1

你的单身人士将无法工作。您不能使用虚方法返回实例,因为它只能用实例调用。您至少需要一个静态方法,或者一个实现单例的中间对象。

如果你打算像这样概括它,你应该阅读 C++ 中单例的实现。然而,我对所有库代码的建议是首先创建您需要的干净简单的实现。在单例情况下,这将简单地将其实现为没有继承的静态方法。然后并且只有当你多次实现它并完全理解抽象实现的所有动机和细节时,你才应该为它创建一个库。过早创建库是导致错误和不可维护代码的最大原因之一。

于 2009-09-24T10:14:54.663 回答