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

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

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

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

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

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

Ошибки: "invalid use of non-static data member", "error: from this location" - C++
Здравствуйте. Помогите пожалуйста понять в чём я не прав. Почему компилятор не даёт объявить указатель на структуру и почему я не могу...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Как пользоваться проектом "Win32 Static Library"? - C++
Привет. В VC6 есть приложение, работающее с SetWindowsHook(). Чтобы пользоваться хуками, сама функция хуков должна находиться в DLL, а...

Вывести все значения массива типа int в поле "static" - C++
Здравствуйте! Есть массив int mass, заполненный случайными числами, так же есть форма, на форме есть поле "static" ...

Ошибка компиляции "forbids in-class initialization of non-const static member" - C++
Доброго времени суток! Прошу помощи, так как сам понять в чем проблема не могу. Имею вот такой код: #include "iostream" ...

30
Mr.X
Эксперт С++
3050 / 1695 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.07.2014, 22:46 #2
Цитата Сообщение от Voroshek Посмотреть сообщение
Объект х будет одинаковым у объектов этого класса, поэтому я хотел бы сделать его static.
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
Ну, сделайте его константным членом класса.
0
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
17.07.2014, 23:01  [ТС] #3
Но ведь тогда для каждого объекта My_class будет создаваться свой х? В чём маржа?
0
Убежденный
Системный программист
Эксперт С++
15686 / 7196 / 1137
Регистрация: 02.05.2013
Сообщений: 11,633
Записей в блоге: 1
Завершенные тесты: 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
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
17.07.2014, 23:21 #5
Цитата Сообщение от Voroshek Посмотреть сообщение
Можно это как-нибудь разрулить?
Паттерн синглетон ?
0
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
18.07.2014, 00:55  [ТС] #6
Сенк. Ещё не дочитал учебник до singleton
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.07.2014, 23:35 #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
1
-=ЮрА=-
Заблокирован
Автор FAQ
18.07.2014, 23:40 #8
Цитата Сообщение от Voroshek Посмотреть сообщение
С другой стороны, объекты My_class будут создаваться нечасто, и не хотелось бы, чтобы х висел в памяти в течение всего времени работы программы.
Можно это как-нибудь разрулить?
- кто мешает попросить объект убить свои данные и продолжить висеть голым?Кинуть метод аля Reset да и чёрт с ним. И будет с одной стороны валидный объект, с другой без ненужных полей с данными. Таймер чтоли прикрутил бы или ивенту какую на очистку, зачем извращения?
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
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
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
19.07.2014, 10:29  [ТС] #11
Благодарю, мэтры.
В принципе, предложение Tulosba как раз то, а -=ЮрА=- няп сказал то же самое, только словами.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
19.07.2014, 10:31 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Если нужно освобождать x, когда нет объектов My_class, то можно так: [skipped....]
Тогда веселуха начнется в многопоточной версии......
0
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
19.07.2014, 10:37  [ТС] #13
Многопоточность пока не требуется
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
19.07.2014, 12:43 #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну я жду разъяснений по поводу твоих слов
По тому что есть такая штука как "синглитон".
0
-=ЮрА=-
19.07.2014, 13:09     Хочу static "с домином и монашками"
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2014, 13:09
Привет! Вот еще темы с ответами:

Классы.Ключевое слово static - выдает ошибку "неразрешенный внешний символ" - C++
Всем доброго времени суток. Изучаю С++ по Шпаку и по урокам на сайте cppstudio.com, предварительно хорошо ознакомившись с ассемблером... ...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...


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

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

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