Надо ограничить количесто создаваемых объектов в куче определенного класса.
Т.е. чтобы например десятый вызов оператора new для класса Sample возвращал 0,
а не выбрасывал исключение. Можно ли так сделать? Исключения не подходят т.к.
в будущем планирую перевести прогу на COM с возможностью скриптования.
Перегрузи new для своего класса, чтобы он считал сколько объектов создано.
Здравствуйте, Аноним, Вы писали:
А>Надо ограничить количесто создаваемых объектов в куче определенного класса.
А>Т.е. чтобы например десятый вызов оператора new для класса Sample возвращал 0,
А>а не выбрасывал исключение. Можно ли так сделать? Исключения не подходят т.к.
А>в будущем планирую перевести прогу на COM с возможностью скриптования.
Например так:
class CSome
{
static int nCounter;
public:
static void* operator new(size_t size)
{
if(nCounter < 10)
{
++nCounter;
return ::operator new(size);
}
else
return 0;
}
static void operator delete(void* p) {--nCounter; ::operator delete(p); }
};
int CSome::nCounter = 0;
Здравствуйте, <Аноним>, Вы писали:
А>Надо ограничить количесто создаваемых объектов в куче определенного класса.
А>Т.е. чтобы например десятый вызов оператора new для класса Sample возвращал 0,
А>а не выбрасывал исключение. Можно ли так сделать? Исключения не подходят т.к.
А>в будущем планирую перевести прогу на COM с возможностью скриптования.
Определи свой operator new() в классе.
Например:
#include <iostream>
using std::cout;
struct A
{
static void *operator new(size_t n)
{
static int count = 0;
if (count < 10)
{
void *p = malloc(n);
if (p)
++count;
return p;
}
return 0;
}
};
int main()
{
for (int i=0; i<13; ++i)
{
A *pa = new A();
if (pa)
{
cout << i << " - Succeeded\n";
delete pa;
}
else
cout << i << " - Failed\n";
}
return 0;
}
... << RSDN@Home 1.0 beta 5 >>
Здравствуйте, Аноним, Вы писали:
А>Перегрузи new для своего класса, чтобы он считал сколько объектов создано.
Прегрузка operator new для этой задачи выглядит как стрельба из пушки по воробъям.
Намного проще добавить классу статический метрд, типа getInstance() (factory method pattern):
class Some
{
public:
enum { LIMIT = 10 };
static Some* getSome()
{
return LIMIT > instances_ ? new Some : 0;
}
~Some() { --instances_; }
private:
Some() { ++instances_; }
static int instances_;
};
int Some::instances_;
int _tmain(int argc, _TCHAR* argv[])
{
Some* p[20];
for (int n = 20; n--;) p[n] = Some::getSome();
for (int n = 20; n--;) delete p[n];
}