Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
 Аватар для Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171

Ограничение количества объектов класса

22.01.2012, 23:16. Показов 5737. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос: как ограничить количество объектов одного класса?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2012, 23:16
Ответы с готовыми решениями:

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса), а также статическую функцию, которая...

Статическое поле класса: подсчет количества созданных объектов
Задание: Дополнить один из классов статическим полем, которое будет считать количество созданных объектов. Реализация: Объявление...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

20
13 / 13 / 3
Регистрация: 12.01.2012
Сообщений: 49
22.01.2012, 23:22
Держать количество объектов класса в статическом члене класса. Ну а с ограничением создания новых объектов всё просто.
0
 Аватар для Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
22.01.2012, 23:39  [ТС]
Ну то, что количество объектов будет содержаться в статической данной, это ясно. Я вообще думал, что может есть какой-то специальный способ запрета создания объекта при определенном условии.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
22.01.2012, 23:41
Riderik, во-первых, следует скрыть возможные конструкторы и операторы присваивания. А объект выдавать по специальному методу (instance), который и будет проверять, можно ли создать ещё объект или нет. Это что-то вроде синглтона, но с ограничением больше одного объекта.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
22.01.2012, 23:48
вот хорошая книга. найдите и скачайте. там этому посвящена целая глава (глава 26). очень хорошо эта задачка описана и не только эта. Подробнее вам на форуме врятли расскажут.
http://rsdn.ru/res/book/cpp/most_effective_cpp.xml
Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
22.01.2012, 23:51
Можно использовать паттерны: строитель, фабрику или что-то еще и в них проверять все что угодно и возращать либо ссылку на обьект либо NULL вот и все проблемы.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
22.01.2012, 23:53
Цитата Сообщение от silent_1991 Посмотреть сообщение
Riderik, во-первых, следует скрыть возможные конструкторы и операторы присваивания.
согласен
Цитата Сообщение от silent_1991 Посмотреть сообщение
А объект выдавать по специальному методу (instance), который и будет проверять, можно ли создать ещё объект или нет. Это что-то вроде синглтона, но с ограничением больше одного объекта.
можно и через абстрактную фабрику
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
23.01.2012, 00:02
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно и через абстрактную фабрику
Я тоже сначала о ней подумал, но если этого для задачи не требуется, достаточно того, о чём я написал.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:07
Вы тут паттернами оперируете, а ТС возможно даже не знает что это и как это применить. Вопрос то не сложный, значит и скиллы соответствующие.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
23.01.2012, 00:13

Не по теме:

На месте ТС я бы разобрался что было написано выше, благо инфы в нете достаточно, и только потом начал задавать вопросы.


И на счет синглтона: сам паттерн немного противоречивый, так как очень сильно завязан на то для чего именно он используется. Я бы не рекомендовал его вообще использовать ТС пока не появится немого опыта, статические переменные пока подойдут.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
23.01.2012, 00:14
outoftime, так я от синглтона предложил взять только концепцию сокрытия конструкторов/операторов присваивания и заменой их методом instance.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:20
в догонку книга по паттернам. для ознакомления самое оно.
http://www.rsdn.ru/res/book/oo/design_patterns.xml
Приемы объектно-ориентированного проектирования. Паттерны проектирования.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
23.01.2012, 00:24
Вот простенький пример реализации такого класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <vector>
 
class Foo
{
public:
    ~Foo()
    {
        --current_count;
    }
    
    static Foo *instance(int foo = 0)
    {
        if (current_count >= max_count)
            return 0;
        
        ++current_count;
        
        return new Foo(foo);
    }
    
    static Foo *instance(const Foo& source)
    {
        return instance(source.get_foo());
    }
    
    int get_foo() const
    {
        return m_foo;
    }
    
    void set_foo(int foo)
    {
        m_foo = foo;
    }
    
private:
    static const size_t max_count = 10;
    static size_t current_count;
    
private:
    Foo(int foo = 0)
    {
        set_foo(foo);
    }
    
    Foo(const Foo& source)
    {
        set_foo(source.get_foo());
    }
    
    Foo& operator=(const Foo& source)
    {
        set_foo(source.get_foo());
        
        return *this;
    }
    
private:
    int m_foo;
};
 
size_t Foo::current_count = 0;
 
int main()
{
    std::vector<Foo *> vec;
    int x = 0;
    
    for (Foo *inst = Foo::instance(x++); inst != 0; inst = Foo::instance(x++))
        vec.push_back(inst);
    
    for (size_t i = 0; i < vec.size(); ++i)
        std::cout << vec[i]->get_foo() << "  ";
    
    std::cout << std::endl;
    
    for (size_t i = 0; i < vec.size(); ++i)
        delete vec[i];
    
    return 0;
}
1
 Аватар для Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 00:29  [ТС]
silent_1991, так и подумал, спасибо.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
23.01.2012, 03:23
мне приходит в голову такой вариант

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <cstdlib>
#include <iostream>
 
template <class T>
class Calculated
{
public:
        Calculated() { ++m_count; }
        Calculated(const Calculated&) { ++m_count; }
        ~Calculated(){ --m_count; }
        static unsigned getCount() { return m_count; }
private:
        static unsigned m_count;
};
 
class Restricted1
{
public:
        Restricted1()  { std::cout << "+"; }
        ~Restricted1() { std::cout << "-"; }
};
 
class Restricted2
{
public:
        Restricted2()  { std::cout << "(+)"; }
        ~Restricted2() { std::cout << "(-)"; }
};
 
template<class T> unsigned Calculated<T>::m_count = 0;
 
template <class T, const unsigned max>
class RestrictFactory
{
public:
        class CRestricted : public T, Calculated<T> {};
        static T* instance()
        {
                if (Calculated<T>::getCount() == max) return NULL;
                return new CRestricted;
        }
};
 
typedef RestrictFactory<Restricted1, 5> Factory1;
typedef RestrictFactory<Restricted2, 3> Factory2;
 
int main()
{
        Restricted1* r1[10];
        for (unsigned i=0 ; i<10 ; ++i) r1[i] = Factory1::instance();
        for (unsigned i=0 ; i<10 ; ++i) delete r1[i];   
        
        Restricted2* r2[10];
        for (unsigned i=0 ; i<10 ; ++i) r2[i] = Factory2::instance();
        for (unsigned i=0 ; i<10 ; ++i) delete r2[i];
}
http://ideone.com/0wSE5
1
31 / 31 / 16
Регистрация: 30.11.2010
Сообщений: 81
23.01.2012, 10:29
И еще одна отличная книжка от Александреску
http://www.rsdn.ru/?res/book/o... tterns.xml
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
27.01.2012, 20:20
Не используйте синглтоны в качества примера и вообще, не надо его сюда лепить, можно и без него обойтись. Как минимум потокобезопасность очень падает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Foo {
public:
    Foo() { }
    ~Foo() { }
};
 
class FooManager {
 
private:
    int count = 0;
 
public:
    FooManager(int max_count = 10) {
        this->max_count = max_count;
    }
 
    Foo* createFoo() {
        if (count == max_count) return 0;
 
        ++count;
        return new Foo();
    }
};
 
static FooManager manage();
 
void main() {
    
    Foo* f = manager.createFoo();
    f->~Foo();
}
В этом случае вам просто надо постоянно пользоваться менеджером, так как именно в нем происходят все необходимые проверки, но от синглтона это отличается не много не мало тем что реализация находится в 2 классах, а значит редактировать код проще и еще можно создать нельколько менеджеров на каждый из видов задач, что является примером хорошей расширяемости, чего синглтон не дает.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.01.2012, 22:30
Цитата Сообщение от outoftime Посмотреть сообщение
Как минимум потокобезопасность очень падает.
что мешает сделать его потокобезопасным?
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
27.01.2012, 23:07
Дело не в том что его нельзя сделать потокобезопасным, в своем примере я не так хотел показать недостатки синглтона как преимущества других подходов, реализация которых и глаз радует, и не заставляет потеть при каждой модификации кода.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.01.2012, 23:14
в примере например не освобождается память
кроме того говоря о многопоточности - менеджер такой же потоконебезопасный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.01.2012, 23:14
Помогаю со студенческими работами здесь

Построение описания класса, создание и уничтожение объектов этого класса
Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть возможность раздельного изменения...

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop __asm nop void main() { ...

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы при создании Subscriber объекты класса...

Ограничение количества цифр после запятой
Как ограничить количество цифр после запятой? Слишком уж дотошная точность получается...Мне только две нужны.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru