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

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

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

Author24 — интернет-сервис помощи студентам
Вопрос: как ограничить количество объектов одного класса?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2012, 23:16
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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


И на счет синглтона: сам паттерн немного противоречивый, так как очень сильно завязан на то для чего именно он используется. Я бы не рекомендовал его вообще использовать ТС пока не появится немого опыта, статические переменные пока подойдут.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
23.01.2012, 00:14 11
outoftime, так я от синглтона предложил взять только концепцию сокрытия конструкторов/операторов присваивания и заменой их методом instance.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:20 12
в догонку книга по паттернам. для ознакомления самое оно.
http://www.rsdn.ru/res/book/oo/design_patterns.xml
Приемы объектно-ориентированного проектирования. Паттерны проектирования.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
23.01.2012, 00:24 13
Вот простенький пример реализации такого класса:
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
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 00:29  [ТС] 14
silent_1991, так и подумал, спасибо.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
23.01.2012, 03:23 15
мне приходит в голову такой вариант

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 16
И еще одна отличная книжка от Александреску
http://www.rsdn.ru/?res/book/o... tterns.xml
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
27.01.2012, 20:20 17
Не используйте синглтоны в качества примера и вообще, не надо его сюда лепить, можно и без него обойтись. Как минимум потокобезопасность очень падает.

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
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.01.2012, 22:30 18
Цитата Сообщение от outoftime Посмотреть сообщение
Как минимум потокобезопасность очень падает.
что мешает сделать его потокобезопасным?
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
27.01.2012, 23:07 19
Дело не в том что его нельзя сделать потокобезопасным, в своем примере я не так хотел показать недостатки синглтона как преимущества других подходов, реализация которых и глаз радует, и не заставляет потеть при каждой модификации кода.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.01.2012, 23:14 20
в примере например не освобождается память
кроме того говоря о многопоточности - менеджер такой же потоконебезопасный
0
27.01.2012, 23:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2012, 23:14
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru