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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

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

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

Вопрос: как ограничить количество объектов одного класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2012, 23:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ограничение количества объектов класса (C++):

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

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

Массив объектов класса. Печать строк-членов класса. - C++
подскажите, как распечатать строки? #include "myString.h" #include <iostream> #define stop __asm nop void main() { ...

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

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

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

20
Finale
13 / 13 / 1
Регистрация: 12.01.2012
Сообщений: 49
22.01.2012, 23:22 #2
Держать количество объектов класса в статическом члене класса. Ну а с ограничением создания новых объектов всё просто.
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.01.2012, 23:39  [ТС] #3
Ну то, что количество объектов будет содержаться в статической данной, это ясно. Я вообще думал, что может есть какой-то специальный способ запрета создания объекта при определенном условии.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
22.01.2012, 23:41 #4
Riderik, во-первых, следует скрыть возможные конструкторы и операторы присваивания. А объект выдавать по специальному методу (instance), который и будет проверять, можно ли создать ещё объект или нет. Это что-то вроде синглтона, но с ограничением больше одного объекта.
0
DU
1483 / 1129 / 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 новых рекомендаций по улучшению ваших программ и проектов
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
22.01.2012, 23:51 #6
Можно использовать паттерны: строитель, фабрику или что-то еще и в них проверять все что угодно и возращать либо ссылку на обьект либо NULL вот и все проблемы.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.01.2012, 23:53 #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Riderik, во-первых, следует скрыть возможные конструкторы и операторы присваивания.
согласен
Цитата Сообщение от silent_1991 Посмотреть сообщение
А объект выдавать по специальному методу (instance), который и будет проверять, можно ли создать ещё объект или нет. Это что-то вроде синглтона, но с ограничением больше одного объекта.
можно и через абстрактную фабрику
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
23.01.2012, 00:02 #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно и через абстрактную фабрику
Я тоже сначала о ней подумал, но если этого для задачи не требуется, достаточно того, о чём я написал.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:07 #9
Вы тут паттернами оперируете, а ТС возможно даже не знает что это и как это применить. Вопрос то не сложный, значит и скиллы соответствующие.
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
23.01.2012, 00:13 #10

Не по теме:

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


И на счет синглтона: сам паттерн немного противоречивый, так как очень сильно завязан на то для чего именно он используется. Я бы не рекомендовал его вообще использовать ТС пока не появится немого опыта, статические переменные пока подойдут.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
23.01.2012, 00:14 #11
outoftime, так я от синглтона предложил взять только концепцию сокрытия конструкторов/операторов присваивания и заменой их методом instance.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.01.2012, 00:20 #12
в догонку книга по паттернам. для ознакомления самое оно.
http://www.rsdn.ru/res/book/oo/design_patterns.xml
Приемы объектно-ориентированного проектирования. Паттерны проектирования.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
1
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 00:29  [ТС] #14
silent_1991, так и подумал, спасибо.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 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
23.01.2012, 03:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2012, 03:23
Привет! Вот еще темы с ответами:

Ограничение количества знаков после запятой (float) - C++
В данном примере , происходит ограничение знаков после запятой для всех переменных float, строками 12,13. А как составить код для...

Mutex ограничение доступа к переменным класса - C++
Доброго времени суток. Подскажите пожалуйста, что я делаю не так? class Bitmap { private: mutex...

Stack overflow при создании большого количества объектов - C++
Здравствуйте Товарищи! Выскакивает ошибка:&quot;Необработанное исключение в &quot;0x000000013fbc1ba7&quot; в &quot;Динамический массив (malloc).exe&quot;:...

Наследование static атрибута(хранение количества объектов наследуемых классов) - C++
Есть абстрактный класс base, от него наследуются 3 класса child1 child2 child3. Создается множество объектов одного из этих трех классов, в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru