Оператор new. Возврат NULL при отказе в создании объекта.
От: Аноним  
Дата: 24.01.03 14:32
Оценка:
Надо ограничить количесто создаваемых объектов в куче определенного класса.
Т.е. чтобы например десятый вызов оператора new для класса Sample возвращал 0,
а не выбрасывал исключение. Можно ли так сделать? Исключения не подходят т.к.
в будущем планирую перевести прогу на COM с возможностью скриптования.
Re: Оператор new. Возврат NULL при отказе в создании объекта
От: Аноним  
Дата: 24.01.03 14:48
Оценка:
Перегрузи new для своего класса, чтобы он считал сколько объектов создано.
Re: Оператор new. Возврат NULL при отказе в создании объекта
От: Bell Россия  
Дата: 24.01.03 14:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Надо ограничить количесто создаваемых объектов в куче определенного класса.

А>Т.е. чтобы например десятый вызов оператора 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;
Любите книгу — источник знаний (с) М.Горький
Re: Оператор new. Возврат NULL при отказе в создании объекта
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 24.01.03 14:54
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Надо ограничить количесто создаваемых объектов в куче определенного класса.

А>Т.е. чтобы например десятый вызов оператора 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 >>
Re[2]: Оператор new. Возврат NULL при отказе в создании объе
От: MaximE Великобритания  
Дата: 25.01.03 02:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Перегрузи 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];
}
Re: Оператор new. Возврат NULL при отказе в создании объекта
От: tst  
Дата: 27.01.03 16:18
Оценка: 7 (1)
Здравствуйте, Аноним, Вы писали:

А>Т.е. чтобы например десятый вызов оператора new для класса Sample возвращал 0,

А>а не выбрасывал исключение. Можно ли так сделать? Исключения не подходят т.к.
А>в будущем планирую перевести прогу на COM с возможностью скриптования.

Можно.Но слишком геморно. Это нехороший способ. Особенно со скриптованием.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.