6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте.
C++
1
2
3
4
class My_class
{
    Any_type x;
};
Объект х будет одинаковым у объектов этого класса, поэтому я хотел бы сделать его static.
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2014, 22:39
Ответы с готовыми решениями:

Хочу, чтобы текст выводился в static text последовательно
Хочу чтобы текст выводился в static text последовательно. Как сделать так чтобы static text не...

Формировать Домином Get/put Запросы
Есть задача, чтобы агент по какому-то событию формировал GET/PUT запросы такая себе синхронизация...

Как правильно разместить static поверх других static-ов
Есть кнопка, нажимая на которую становится видно статик. проблема в том, что статик отображатеся...

ошибка java: non-static variable this cannot be referenced from a static context
Помогите решить ошибку, пожалуйста. Искала решение забрать static, но это не сработало....

Как изменить свойство non-static объекта из static метода
Понимаю, что такое не задумано средствами Net Framework, но у меня из-за этого не работает одна...

30
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.07.2014, 22:46 2
Цитата Сообщение от Voroshek Посмотреть сообщение
Объект х будет одинаковым у объектов этого класса, поэтому я хотел бы сделать его static.
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
Ну, сделайте его константным членом класса.
0
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
17.07.2014, 23:01  [ТС] 3
Но ведь тогда для каждого объекта My_class будет создаваться свой х? В чём маржа?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.07.2014, 23:14 4
Voroshek, как вариант - статический локальный объект.
Типа такого:
C++
1
2
3
4
5
6
someobject &
get_someobject()
{
    static someobject Obj;
    return Obj;
}
Объект будет иметь статическое время жизни, но создан он
будет только в случае вызова функции get_someobject.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.07.2014, 23:21 5
Цитата Сообщение от Voroshek Посмотреть сообщение
Можно это как-нибудь разрулить?
Паттерн синглетон ?
0
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
18.07.2014, 00:55  [ТС] 6
Сенк. Ещё не дочитал учебник до singleton
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.07.2014, 23:35 7
Лучший ответ Сообщение было отмечено Voroshek как решение

Решение

Цитата Сообщение от 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
1
Заблокирован
Автор FAQ
18.07.2014, 23:40 8
Цитата Сообщение от Voroshek Посмотреть сообщение
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
- кто мешает попросить объект убить свои данные и продолжить висеть голым?Кинуть метод аля Reset да и чёрт с ним. И будет с одной стороны валидный объект, с другой без ненужных полей с данными. Таймер чтоли прикрутил бы или ивенту какую на очистку, зачем извращения?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.07.2014, 23:50 9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
кто мешает попросить объект убить свои данные и продолжить висеть голым?Кинуть метод аля Reset да и чёрт с ним. И будет с одной стороны валидный объект, с другой без ненужных полей с данными. Таймер чтоли прикрутил бы или ивенту какую на очистку,
То что ты описал как раз и есть извращения.
0
Заблокирован
Автор FAQ
19.07.2014, 10:24 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

Не по теме:

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

0
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
19.07.2014, 10:29  [ТС] 11
Благодарю, мэтры.
В принципе, предложение Tulosba как раз то, а -=ЮрА=- няп сказал то же самое, только словами.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.07.2014, 10:31 12
Цитата Сообщение от Tulosba Посмотреть сообщение
Если нужно освобождать x, когда нет объектов My_class, то можно так: [skipped....]
Тогда веселуха начнется в многопоточной версии......
0
6 / 6 / 5
Регистрация: 22.08.2011
Сообщений: 75
19.07.2014, 10:37  [ТС] 13
Многопоточность пока не требуется
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.07.2014, 12:43 14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну я жду разъяснений по поводу твоих слов
По тому что есть такая штука как "синглитон".
0
-=ЮрА=-
19.07.2014, 13:09
  #15

Не по теме:

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

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

Не по теме:

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

0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.07.2014, 13:30 20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- выше показал что будет. А если ты пишешь без проверок на валидность данных которые ты собираешся использовать то нам вообще не о чем разговаривать
А при чем тут проверка на валидность поможет ? Нужно пересоздавать объект а не кричать пользователю бе ...
Собственно это и делает синглитон.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
на лентяй читай http://habrahabr.ru/post/116577 в гугл зайти не можешь
Т.е. тот пример который ты накатал, лишен указанных там недостатков?
0
19.07.2014, 13:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2014, 13:30
Помогаю со студенческими работами здесь

Вызов static методов из static класса динамически подключаемой библиотеки, которая неизвестна на момент компиляции
Можете привести пример или указать ссылку, как можно вызвать методы из библиотеки... Весь...

Ошибка non-static method cannot be referenced from a static context
Пишу программу, позволяющую найти минимум некоторой функции на заданном интервале. Алгоритм...

Ошибка: Cannot make a static reference to the non-static method
решил учить андроид. решил написать чат, но при создании сервера на Java по примеру на сайте у...

Как обратится к non static property из static метода
День добрый, сразу вопрос static - как правильно статический или статичный? У меня есть некий...

Обращение к не static базе данных из static-метода
Есть у меня БД .sqlite . Она создаётся из не static метода: public IDbConnection database;...


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

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

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