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

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

Войти
Регистрация
Восстановить пароль
 
 
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
#1

Хочу static "с домином и монашками" - C++

17.07.2014, 22:39. Просмотров 995. Ответов 30
Метки нет (Все метки)

Здравствуйте.
C++
1
2
3
4
class My_class
{
    Any_type x;
};
Объект х будет одинаковым у объектов этого класса, поэтому я хотел бы сделать его static.
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 22:39     Хочу static "с домином и монашками"
Посмотрите здесь:

C++ "Угадай число" (напишите программу, хочу проверить со своей).
C++ Как пользоваться проектом "Win32 Static Library"?
C++ хочу попробовать всунуть "for (int j=0; j<5; j++)" в cin. Как это можно реализовать?
C++ Необработанное исключение в "0x013f2b22" в "123.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd"
C++ С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён.
Классы.Ключевое слово static - выдает ошибку "неразрешенный внешний символ" C++
C++ В массиве структур студент с полями "ИМЯ" "ВОЗРАСТ" "УСПЕВАЕМОСТЬ" выполнить сортировку по успеваемости по возрастанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.07.2014, 22:46     Хочу static "с домином и монашками" #2
Цитата Сообщение от Voroshek Посмотреть сообщение
Объект х будет одинаковым у объектов этого класса, поэтому я хотел бы сделать его static.
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
Ну, сделайте его константным членом класса.
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
17.07.2014, 23:01  [ТС]     Хочу static "с домином и монашками" #3
Но ведь тогда для каждого объекта My_class будет создаваться свой х? В чём маржа?
Убежденный
Системный программист
Эксперт С++
15102 / 6797 / 1073
Регистрация: 02.05.2013
Сообщений: 11,110
Завершенные тесты: 1
17.07.2014, 23:14     Хочу static "с домином и монашками" #4
Voroshek, как вариант - статический локальный объект.
Типа такого:
C++
1
2
3
4
5
6
someobject &
get_someobject()
{
    static someobject Obj;
    return Obj;
}
Объект будет иметь статическое время жизни, но создан он
будет только в случае вызова функции get_someobject.
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,053
Записей в блоге: 17
17.07.2014, 23:21     Хочу static "с домином и монашками" #5
Цитата Сообщение от Voroshek Посмотреть сообщение
Можно это как-нибудь разрулить?
Паттерн синглетон ?
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
18.07.2014, 00:55  [ТС]     Хочу static "с домином и монашками" #6
Сенк. Ещё не дочитал учебник до singleton
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.07.2014, 23:35     Хочу static "с домином и монашками" #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Voroshek Посмотреть сообщение
объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Если нужно освобождать x, когда нет объектов My_class, то можно так:
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
#include <iostream>
 
struct X 
{
    X() { std::cout << "X ctor\n"; }
    ~X() { std::cout << "X dtor\n"; }
};
 
struct M
{
    M() 
    { 
        if( ++cnt == 1) x = new X;
    }
    ~M()
    {
        if( !--cnt ) delete x;
    }
private:
    static int cnt;
    static X* x;
};
 
int M::cnt = 0;
X* M::x = nullptr;
 
int main() {
    
    {
        M m;
        M m2;
    }   
    
    M* mp = new M;
    
    M m3;
    
    delete mp;
    
    return 0;
}
http://ideone.com/KflMl5
-=ЮрА=-
Заблокирован
Автор FAQ
18.07.2014, 23:40     Хочу static "с домином и монашками" #8
Цитата Сообщение от Voroshek Посмотреть сообщение
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
- кто мешает попросить объект убить свои данные и продолжить висеть голым?Кинуть метод аля Reset да и чёрт с ним. И будет с одной стороны валидный объект, с другой без ненужных полей с данными. Таймер чтоли прикрутил бы или ивенту какую на очистку, зачем извращения?
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,053
Записей в блоге: 17
18.07.2014, 23:50     Хочу static "с домином и монашками" #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
кто мешает попросить объект убить свои данные и продолжить висеть голым?Кинуть метод аля Reset да и чёрт с ним. И будет с одной стороны валидный объект, с другой без ненужных полей с данными. Таймер чтоли прикрутил бы или ивенту какую на очистку,
То что ты описал как раз и есть извращения.
-=ЮрА=-
Заблокирован
Автор FAQ
19.07.2014, 10:24     Хочу static "с домином и монашками" #10
Avazart, ну я жду разъяснений по поводу твоих слов
Цитата Сообщение от Avazart Посмотреть сообщение
То что ты описал как раз и есть извращения.
, ниже тебе пожевать код, в котором после создания второго экземпляра CSomeClass один из элементов полностью чистит кеш. Ну где тут изврат, нука?А где изврат если произойдёт сбросс кеша по определённому событию или интервалу времени, а?
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <ctime>
#include <list>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
 
string rand8btstr(){
    string str;
    for(size_t i = 0; i < 8; i++ )
        str += 48 + rand()%80;
    return str;
}
 
struct CACHE_ITEM{
    string name;
    CACHE_ITEM(){
        name = rand8btstr();
        cout<<name<<endl;
    }
};
 
class CSomeCache
{
    vector<CACHE_ITEM> data;
    int numhinstances;
public:
    CSomeCache(){
        numhinstances = 0;
    }
    void Reset(){
        data.clear();
        cout<<"\tRESET:"<<endl;
        cout<<"COUNT  : "<<numhinstances<<endl;
        cout<<"SIZE   : "<<data.size()<<endl;
    }
    void Add(const CACHE_ITEM &pItem){
        data.push_back(pItem);
        cout<<"SIZE   : "<<data.size()<<endl;
    }
    void Attach(){
        cout<<"Attach : "<<endl;
        cout<<"COUNT  : "<<++numhinstances<<endl;
        
    }
    void Detach(){
        cout<<"Detach :"<<endl;
        cout<<"COUNT  : "<<--numhinstances<<endl;
        if( numhinstances == 0 )
            Reset();
        else
        cout<<"SIZE   : "<<data.size()<<endl;
    }
};
 
class CSomeClass{
    static CSomeCache pCache;
    CSomeCache * pointer;
public:
    CSomeClass(){
        pointer = &pCache;
        CACHE_ITEM pItem;
        if( pointer ){
            pointer->Attach();
            pointer->Add(pItem);
        }
    }
    ~CSomeClass(){
        if( pointer )
            pointer->Detach();
    }
    bool Reset(){
        if( pointer )
            pointer->Reset();
        return pointer != 0;
    }
};
 
CSomeCache CSomeClass::pCache;
 
int main()
{
    CSomeClass * ptr1 = new CSomeClass();
    CSomeClass * ptr2 = new CSomeClass();
    cout<<"\tRESIZE 2 : "<<endl;
    if( ptr1 )
    if(!ptr1->Reset() )
        cout<<"RESET ERROR"<<endl;
    else
        cout<<"RESET SUCCESS"<<endl;
    cout<<"\tRESIZE 3 : "<<endl;
    CSomeClass * ptr3 = new CSomeClass();
    cout<<"\tRESIZE 0 : "<<endl;
    delete ptr1;
    delete ptr2;
    delete ptr3;
    cin.get();
    return 0;
}
G6iSQ?J<
Attach :
COUNT : 1
SIZE : 1
9mZKbk36
Attach :
COUNT : 2
SIZE : 2
RESIZE 2 :
RESET:
COUNT : 2
SIZE : 0
RESET SUCCESS
RESIZE 3 :
lrdh;87M
Attach :
COUNT : 3
SIZE : 1
RESIZE 0 :
Detach :
COUNT : 2
SIZE : 1
Detach :
COUNT : 1
SIZE : 1
Detach :
COUNT : 0
RESET:
COUNT : 0
SIZE : 0

Не по теме:

Ты бы лучше занимался фрилансом, правда и там советую потише себя вести, это так к слову.

Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
19.07.2014, 10:29  [ТС]     Хочу static "с домином и монашками" #11
Благодарю, мэтры.
В принципе, предложение Tulosba как раз то, а -=ЮрА=- няп сказал то же самое, только словами.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,343
19.07.2014, 10:31     Хочу static "с домином и монашками" #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Если нужно освобождать x, когда нет объектов My_class, то можно так: [skipped....]
Тогда веселуха начнется в многопоточной версии......
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
19.07.2014, 10:37  [ТС]     Хочу static "с домином и монашками" #13
Многопоточность пока не требуется
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,053
Записей в блоге: 17
19.07.2014, 12:43     Хочу static "с домином и монашками" #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну я жду разъяснений по поводу твоих слов
По тому что есть такая штука как "синглитон".
-=ЮрА=-
19.07.2014, 13:09
  #15

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
По тому что есть такая штука как "синглитон".
- который имеет кучу недостатков. В принципе ответа плана "потому что гладиолус" я от тебя и не ожидал

Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,053
Записей в блоге: 17
19.07.2014, 13:22     Хочу static "с домином и монашками" #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- который имеет кучу недостатков.
Например ?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
В принципе ответа плана "потому что гладиолус" я от тебя и не ожидал
А что стоило объяснить что твое решение частное на не общее ?
И что когда объект голый могут возникать обращения к "его одежде" которой его лишили.
-=ЮрА=-
Заблокирован
Автор FAQ
19.07.2014, 13:26     Хочу static "с домином и монашками" #17
Цитата Сообщение от Avazart Посмотреть сообщение
Например ?
- прочти пару сатей на хабре если просто в жизни не встречался
Цитата Сообщение от Avazart Посмотреть сообщение
И что когда объект голый могут возникать обращения к "его одежде" которой его лишили.
- выше показал что будет - всё будет работать. Причём в коде можно было вообще обойтись без аналогв interlocked increment(decrement)
ЗЫ : Если ты пишешь без проверок на валидность данных которые ты собираешся использовать то нам вообще не о чем разговаривать
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,053
Записей в блоге: 17
19.07.2014, 13:28     Хочу static "с домином и монашками" #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- прочти пару сатей на хабре если просто в жизни не встречался
В стиле
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
"потому что гладиолус"
-=ЮрА=-
19.07.2014, 13:29
  #19

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
В стиле
Сообщение от -=ЮрА=-
"потому что гладиолус"
на лентяй читай http://habrahabr.ru/post/116577 в гугл зайти не можешь

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2014, 13:30     Хочу static "с домином и монашками"
Еще ссылки по теме:

C++ Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел
C++ Ошибка компиляции "forbids in-class initialization of non-const static member"
Вывести все значения массива типа int в поле "static" C++
Написать функцию поиска человека по полю "фамилия" в массиве структур "Note" ("Персональная информация") C++
C++ Ошибка "non-static data member initializers only available with -std=c++11 or -std=gnu++11"

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

Или воспользуйтесь поиском по форуму:
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,053
Записей в блоге: 17
19.07.2014, 13:30     Хочу static "с домином и монашками" #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- выше показал что будет. А если ты пишешь без проверок на валидность данных которые ты собираешся использовать то нам вообще не о чем разговаривать
А при чем тут проверка на валидность поможет ? Нужно пересоздавать объект а не кричать пользователю бе ...
Собственно это и делает синглитон.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
на лентяй читай http://habrahabr.ru/post/116577 в гугл зайти не можешь
Т.е. тот пример который ты накатал, лишен указанных там недостатков?
Yandex
Объявления
19.07.2014, 13:30     Хочу static "с домином и монашками"
Ответ Создать тему
Опции темы

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