Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.01.2012, 23:16     Ограничение количества объектов класса #1
Вопрос: как ограничить количество объектов одного класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Finale
13 / 13 / 1
Регистрация: 12.01.2012
Сообщений: 49
22.01.2012, 23:22     Ограничение количества объектов класса #2
Держать количество объектов класса в статическом члене класса. Ну а с ограничением создания новых объектов всё просто.
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.01.2012, 23:39  [ТС]     Ограничение количества объектов класса #3
Ну то, что количество объектов будет содержаться в статической данной, это ясно. Я вообще думал, что может есть какой-то специальный способ запрета создания объекта при определенном условии.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.01.2012, 23:41     Ограничение количества объектов класса #4
Riderik, во-первых, следует скрыть возможные конструкторы и операторы присваивания. А объект выдавать по специальному методу (instance), который и будет проверять, можно ли создать ещё объект или нет. Это что-то вроде синглтона, но с ограничением больше одного объекта.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.01.2012, 23:48     Ограничение количества объектов класса #5
вот хорошая книга. найдите и скачайте. там этому посвящена целая глава (глава 26). очень хорошо эта задачка описана и не только эта. Подробнее вам на форуме врятли расскажут.
http://rsdn.ru/res/book/cpp/most_effective_cpp.xml
Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
22.01.2012, 23:51     Ограничение количества объектов класса #6
Можно использовать паттерны: строитель, фабрику или что-то еще и в них проверять все что угодно и возращать либо ссылку на обьект либо NULL вот и все проблемы.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
22.01.2012, 23:53     Ограничение количества объектов класса #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Riderik, во-первых, следует скрыть возможные конструкторы и операторы присваивания.
согласен
Цитата Сообщение от silent_1991 Посмотреть сообщение
А объект выдавать по специальному методу (instance), который и будет проверять, можно ли создать ещё объект или нет. Это что-то вроде синглтона, но с ограничением больше одного объекта.
можно и через абстрактную фабрику
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.01.2012, 00:02     Ограничение количества объектов класса #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно и через абстрактную фабрику
Я тоже сначала о ней подумал, но если этого для задачи не требуется, достаточно того, о чём я написал.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:07     Ограничение количества объектов класса #9
Вы тут паттернами оперируете, а ТС возможно даже не знает что это и как это применить. Вопрос то не сложный, значит и скиллы соответствующие.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
23.01.2012, 00:13     Ограничение количества объектов класса #10

Не по теме:

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


И на счет синглтона: сам паттерн немного противоречивый, так как очень сильно завязан на то для чего именно он используется. Я бы не рекомендовал его вообще использовать ТС пока не появится немого опыта, статические переменные пока подойдут.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.01.2012, 00:14     Ограничение количества объектов класса #11
outoftime, так я от синглтона предложил взять только концепцию сокрытия конструкторов/операторов присваивания и заменой их методом instance.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:20     Ограничение количества объектов класса #12
в догонку книга по паттернам. для ознакомления самое оно.
http://www.rsdn.ru/res/book/oo/design_patterns.xml
Приемы объектно-ориентированного проектирования. Паттерны проектирования.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
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;
}
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 00:29  [ТС]     Ограничение количества объектов класса #14
silent_1991, так и подумал, спасибо.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
Vergil111
31 / 31 / 6
Регистрация: 30.11.2010
Сообщений: 81
23.01.2012, 10:29     Ограничение количества объектов класса #16
И еще одна отличная книжка от Александреску
http://www.rsdn.ru/?res/book/oo/design_patterns.xml
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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 классах, а значит редактировать код проще и еще можно создать нельколько менеджеров на каждый из видов задач, что является примером хорошей расширяемости, чего синглтон не дает.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
27.01.2012, 22:30     Ограничение количества объектов класса #18
Цитата Сообщение от outoftime Посмотреть сообщение
Как минимум потокобезопасность очень падает.
что мешает сделать его потокобезопасным?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
27.01.2012, 23:07     Ограничение количества объектов класса #19
Дело не в том что его нельзя сделать потокобезопасным, в своем примере я не так хотел показать недостатки синглтона как преимущества других подходов, реализация которых и глаз радует, и не заставляет потеть при каждой модификации кода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2012, 23:14     Ограничение количества объектов класса
Еще ссылки по теме:

Наследование static атрибута(хранение количества объектов наследуемых классов) C++
Массив объектов класса как член другого класса C++
Построение описания класса, создание и уничтожение объектов этого класса C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
27.01.2012, 23:14     Ограничение количества объектов класса #20
в примере например не освобождается память
кроме того говоря о многопоточности - менеджер такой же потоконебезопасный
Yandex
Объявления
27.01.2012, 23:14     Ограничение количества объектов класса
Ответ Создать тему
Опции темы

Текущее время: 17:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru