C++ 将接口“ISingleton”抽象为基类
我有3个接口类C++ 将接口“ISingleton”抽象为基类,c++,design-patterns,singleton,multiple-inheritance,C++,Design Patterns,Singleton,Multiple Inheritance,我有3个接口类IVideo、IAudio、IGPIO,另外三个类将实现这些接口:Video\u impl、Audio\u impl、GPIO\u impl 到目前为止,事情很简单 但是,我希望所有这些对象都是单态的。以下是问题: 抽象接口ISingleton,以便Video\u impl、Audio\u impl、GPIO\u impl(或IVideo、IAudio、IGPIO)可以从中继承是一个好主意吗 我想用下面的方法来实现它。推荐吗?我想一定有更好的办法 //Isingleton.hpp
IVideo、IAudio、IGPIO
,另外三个类将实现这些接口:Video\u impl、Audio\u impl、GPIO\u impl
到目前为止,事情很简单
但是,我希望所有这些对象都是单态的。以下是问题:
抽象接口ISingleton
,以便Video\u impl、Audio\u impl、GPIO\u 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;
};
//Isingleton.hpp
模板
伊辛格尔顿级
{
公众:
虚拟T*getInstance()=0;
};
IGPIO类
{
公众:
虚拟int SelectAudioInput()=0;
};
类GPIO_impl:公共IGPIO、公共ISingleton
{
公众:
IGPIO*getInstance();
int SelectAudioInput();
私人:
IGPIO*实例;
};
我看不出这有什么好处。您仍然必须在派生类中实现getInstance()方法。因此,您已经引入了模板和多重继承,但并没有真正获得任何成果。我能看到的唯一一个小小的好处是你把你所有的独生子女的份额都变成了一个普通的方法,但这是一个如此普通的模式,我认为这不是一个真正的好处。我看不出这有什么好处。您仍然必须在派生类中实现getInstance()方法。因此,您已经引入了模板和多重继承,但并没有真正获得任何成果。我能看到的唯一的收获是你把你的单身贵族的一个共同的方法,但这是一个很常见的模式,我不认为这是一个真正的增益。 < P>我建议阅读Alexandrescu的“现代C++设计”。在这本书中,除其他许多内容外,他设计了一个成熟的单例模板,并仔细考虑了许多问题,例如什么时候应该销毁,是否应该在销毁后复活,因为在销毁其他单例时需要它,以及所有这些好东西。我建议阅读Alexandrescu的“现代C++设计”“。在这本书中,他设计了一个成熟的单例模板,并仔细考虑了许多问题,比如什么时候应该销毁,销毁后是否应该复活,因为在销毁其他单例时需要它,以及所有这些好东西。你的单例无法工作。不能使用虚方法返回实例,因为只能通过实例调用虚方法。您至少需要一个静态方法,或者一个实现singleton的中间对象
<>你应该阅读C++中的单体实现,如果你打算把它概括成这样的话。然而,我对所有库代码的建议是,首先创建所需的干净简单的实现。在单例情况下,这将是一个简单的实现,作为一个没有继承的静态方法。然后,并且只有当您已经实现了很多次并且完全理解抽象实现的所有动机和细节时,您才应该为它创建一个库。过早创建库是导致错误和无法维护代码的最大原因之一。您的单例程序无法工作。不能使用虚方法返回实例,因为只能通过实例调用虚方法。您至少需要一个静态方法,或者一个实现singleton的中间对象
<>你应该阅读C++中的单体实现,如果你打算把它概括成这样的话。然而,我对所有库代码的建议是,首先创建所需的干净简单的实现。在单例情况下,这将是一个简单的实现,作为一个没有继承的静态方法。然后,并且只有当您已经实现了很多次并且完全理解抽象实现的所有动机和细节时,您才应该为它创建一个库。过早创建库是错误和不可维护代码的最大原因之一。看起来更像C++ + C……谢谢,Stefan.It是C++。看起来更像C++ + C……谢谢,Stefan.It是C++。确实,生命的问题是棘手的,不应该低估。我喜欢凤凰政策:)事实上,生命的问题是棘手的,不应低估,我喜欢凤凰政策:)