0

3つのインターフェイスクラスIVideo , IAudio , IGPIOと、それらのインターフェイスを実装する他の3つのクラスがありますVideo_impl , Audio_impl , GPIO_impl

これまでのところ、物事は単純です。

しかし、私はそれらすべてのオブジェクトをシングルトンにしたいのです。質問は次のとおりです。

(または?)がインターフェイスから継承できるISingletonように、インターフェイスを抽象化することをお勧めしますか?Video_impl , Audio_impl , GPIO_implIVideo , 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の「ModernC++Design」を読むことをお勧めします。その中で、とりわけ、彼は本格的なシングルトンテンプレートを設計し、いつ破棄する必要があるか、他のシングルトンの破棄中に必要になるため、破棄後に復活する必要があるかどうかなど、多くの問題を検討します。そして、そのすべての良いもの。

于 2009-09-24T09:43:35.083 に答える
1

ここではメリットがわかりません。派生クラスにgetInstance()メソッドを実装する必要があります。したがって、テンプレートと多重継承を導入しましたが、実際には何も得られていません。私が見ることができる唯一の小さな利益は、すべてのシングルトンの共有を共通の方法にしていることですが、これは非常に一般的なパターンであるため、実際の利益ではないと思います。

于 2009-09-24T09:33:54.463 に答える
1

シングルトンは機能しません。仮想メソッドを使用してインスタンスを返すことはできません。これは、インスタンスでのみ呼び出すことができるためです。少なくとも静的メソッド、またはシングルトンを実装する中間オブジェクトが必要です。

このように一般化する場合は、C++でのシングルトンの実装についてよく読んでください。ただし、すべてのライブラリコードに対する私のアドバイスは、最初に必要なクリーンでシンプルな実装を作成することです。シングルトンの場合、これは継承のない静的メソッドとして単純に実装されます。次に、それを何度も実装し、抽象的な実装のすべての動機と詳細を完全に理解した場合にのみ、そのライブラリを作成する必要があります。ライブラリの作成が早すぎることは、バグや保守不可能なコードの最大の原因の1つです。

于 2009-09-24T10:14:54.663 に答える