クラスを指定して、このクラスから作成されるオブジェクトの数を指定された数、たとえば4に制限したいと思います。
これを達成する方法はありますか?
基本的な考え方は、静的変数で作成されたインスタンスの数を数えることです。私はそれをこのように実装します。より単純なアプローチが存在しますが、これにはいくつかの利点があります。
template<class T, int maxInstances>
class Counter {
protected:
Counter() {
if( ++noInstances() > maxInstances ) {
throw logic_error( "Cannot create another instance" );
}
}
int& noInstances() {
static int noInstances = 0;
return noInstances;
}
/* this can be uncommented to restrict the number of instances at given moment rather than creations
~Counter() {
--noInstances();
}
*/
};
class YourClass : Counter<YourClass, 4> {
}
インスタンスマネージャのパターンを探しています。基本的には、そのクラスのインスタンス化をマネージャークラスに制限します。
class A
{
private: //redundant
friend class AManager;
A();
};
class AManager
{
static int noInstances; //initialize to 0
public:
A* createA()
{
if ( noInstances < 4 )
{
++noInstances;
return new A;
}
return NULL; //or throw exception
}
};
短い方法はコンストラクターから例外をスローすることですが、それを正しく行うのは難しい場合があります。
class A
{
public:
A()
{
static int count = 0;
++count;
if ( count >= 4 )
{
throw TooManyInstances();
}
}
};