Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как сделать лимит копий класса?

1.9K
17 января 2006 года
SkLite
38 / / 02.12.2002
Есть класс с учетом его копий. Как при создании, например пятой копии, сделать чтобы новый класс не создавался? Т. е. класс сам должен решать создаваться ему или нет.
3
17 января 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by SkLite
Есть класс с учетом его копий. Как при создании, например пятой копии, сделать чтобы новый класс не создавался? Т. е. класс сам должен решать создаваться ему или нет.


Класс или экземпляр класса?

Если ты имел в виду экземпляр класса, то всё достаточно просто. Создаешь фабрику и с помощью неё лимитируешь количество производимых объектов.

Писать код не буду, он элементарен, и ты сможешь сделать его сам.
Вот ссылка по теме: http://ooad.asf.ru/patterns/patterninfo.asp?id=8

255
17 января 2006 года
Dart Bobr
1.4K / / 09.04.2004
Цитата:
Originally posted by Green
Класс или экземпляр класса?

Если ты имел в виду экземпляр класса, то всё достаточно просто. Создаешь фабрику и с помощью неё лимитируешь количество производимых объектов.

Писать код не буду, он элементарен, и ты сможешь сделать его сам.
Вот ссылка по теме: http://ooad.asf.ru/patterns/patterninfo.asp?id=8


А не проще создать, к примеру, файл, в который писать к-во екземпляров класса, а в конструкторе сделать проверку?

1.9K
17 января 2006 года
SkLite
38 / / 02.12.2002
Цитата:
Originally posted by Dart Bobr
А не проще создать, к примеру, файл, в который писать к-во екземпляров класса, а в конструкторе сделать проверку?


Количество экземпляров класса оно и так есть (static int ClassCount). Как в конструкторе запретить создаваться классу? Например:
CMyClass c1, c2, c3;
так вот с1 и с2 должныбыть != 0, а с3 == 0. Как этого добиться?

2 Green
Про фабрику я просмотрел, толком ничего не понял, но мне кажется это не совсем то. К тому же там все сильно наворочено, должено быть более простое решение? IMHO Позже почитаю более внимательно, может поможет чем :)

3
17 января 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by SkLite
Количество экземпляров класса оно и так есть (static int ClassCount). Как в конструкторе запретить создаваться классу? Например:
CMyClass c1, c2, c3;
так вот с1 и с2 должныбыть != 0, а с3 == 0. Как этого добиться?

2 Green
Про фабрику я просмотрел, толком ничего не понял, но мне кажется это не совсем то. К тому же там все сильно наворочено, должено быть более простое решение? IMHO Позже почитаю более внимательно, может поможет чем :)



Для начала постарайся не путаться в понятиях.
CMyClass c1, c2, c3; - это создание ЭКЗЕМПЛЯРОВ класса, а не класса. Класс тут один CMyClass.

Теперь вратце что такое фабрика, точнее фабричный метод, - это метод который создает объект и возвращает его интерфейс.
Для этого обычно определяют открытый интерфейс (чисто абстрактный класс), а так же определяют (обычно закрытый) класс объекта отнаследованный от этого интерфейса.
В данном случае тебе такое разделение не надо, достаточно просто определить класс с закрытым конструктором и определить метод (фабрику) дружественный этому классу. Закрытый конструктор нужен для того, чтобы только фабрика могла создавать экземпляры данного класса.
Далее реализуя фабрику сделай подсчет количества созданных объектов. При превышении лимита возвращай NULL. Вот и всё...
Ничего навороченного.

Код:
class Limit
{
public:
    static Limit* getInstance() {
        static int count = 0;
        return (++count > 3) ? 0 : new Limit;
    }

private:
    Limit() {};
};

Можно так же сделать подсчет количества созданных экземпляров непосредственно в конструкторе класса и выдавать exeption при привышении лимита.
 
Код:
struct Limit
{
    Limit() {
        static int count = 0;
        if(++count > 3) throw;
    }
};

Но это IMHO некрасивый ход. Да и вообще сама твоя задача очень исскуственна, мне кажется, что можно обойтись и без неё. Расскажи, зачем тебе это надо?
1.9K
17 января 2006 года
SkLite
38 / / 02.12.2002
Цитата:
Originally posted by Green
Код:
class Limit
{
public:
    static Limit* getInstance() {
        static int count = 0;
        return (++count > 3) ? 0 : new Limit;
    }

private:
    Limit() {};
};


Спасибо, принцип понял, не очень красиво - зато то, что нужно!

Это будет класс консолей, но их количество заранее не известно и втечение времени может меняться 8)

12K
20 января 2006 года
patriotLviv
10 / / 13.10.2005
Це все добре але перевірку треба робити не вконструкторі. Треба оголосити конструктор private і створити якийсь метод
public Thisclass CreateObject() в якому буде виконуватись перевірка і якщо екземплярів класу менше 5 викликається конструкто і повертається екземпляр класу Thisclass.
3
20 января 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by patriotLviv
Це все добре але перевірку треба робити не вконструкторі. Треба оголосити конструктор private і створити якийсь метод
public Thisclass CreateObject() в якому буде виконуватись перевірка і якщо екземплярів класу менше 5 викликається конструкто і повертається екземпляр класу Thisclass.


Интересно, ты топики чуть выше читаешь?

351
23 января 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Green
Интересно, ты топики чуть выше читаешь?



Да он бы и рад почитать да не может, по русски непонимает :). А может ему религия мешает по русски читать ? :D :D :D

3
23 января 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by PitxBull
Да он бы и рад почитать да не может, по русски непонимает :). А может ему религия мешает по русски читать ? :D :D :D


Не надо так ценично.

12K
01 февраля 2006 года
patriotLviv
10 / / 13.10.2005
Цитата:
Originally posted by PitxBull
Да он бы и рад почитать да не может, по русски непонимает :). А может ему религия мешает по русски читать ? :D :D :D



Чому не розумію я все добре на російській розумію, просто вчився в українській школі і мені тяжко писати на російській

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог