Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Статичные члены класса.  (Прочитано 8475 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 07-12-2009 14:53 » new

Привет Улыбаюсь

Если мне необходимо, чтобы все экземпляры класса А пользовались одними и теми же структурами данных - ни в коем случае каждый экземпляр не создавал копии этих структур, то эти структуры я объявляю как static члены - правильно?

Подскажите, пожалуйста, где и как мне инициализировать, а затем удалить статичные члены? Какие здесь применяются правила или приемы? Ведь, как я понял, нельзя инициализировать статичные члены в конструкторе? А уничтожать в деструкторе.
Главное избежать ситуации, в которой один их экземпляров класса попытался бы использовать не инициализированные статичные члены.
Может, хранить отдельный член (тоже статичный), который бы отслеживал все это?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-12-2009 15:00 » 

Инициализировать в конструкторе можно - надо только предусмотреть какой-то признак, что данные уже проинициализированы.
Уничтожать можно не сами данные, а только динамическую составляющую, если она была и больше не нужна остальным экземплярам класса.

Инициализировать можно статически - в модуле класса.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 07-12-2009 15:08 » 

Статичные члены могут быть в секции private?
Тогда их уже нельзя инициализировать статически в модуле класса?
« Последнее редактирование: 07-12-2009 15:10 от The Nameless One » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 07-12-2009 15:14 » 

Ты можеш объявлять метод или переменную в классе статичным абсолютно в любой секции. Статичные переменные класса кстати нужно парковать. Иначе у тебя линковшик просто не соберет прогу.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 07-12-2009 15:17 » 

Что значит "парковать"?

Подозреваю, что статичные переменные нужно объявить глобально?

Все, я вроде бы все вспомнил - спасибо большое:))!
Просто еще не приходилось использовать статик-члены, а читал я про них сто лет назад.

Воде можно так сделать: создать статик-член int, который бы отслеживал количество экземпляров. Этот член увеличивался бы в конструкторе, а в деструкторе бы уменьшался, по нему можно и проверять, надо ли инициализировать статик-данные или овсобождать.
Улыбаюсь
« Последнее редактирование: 07-12-2009 15:34 от The Nameless One » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 08-12-2009 03:56 » 

со статическими мемберами класса всегда морока. Я для себя нашёл выход в использовании статической функции, вот как-то так:
Код:


class A
{
enum
{
e_return_current,
e_increment,
e_decrement,
};


public:
static  int st_Counter(int command=e_return_current)
{
static int Counter=0;

//синхронизация
... .Lock();


switch(command)
{
case e_increment:Counter++;break;
case e_decrement:Counter--;break;
}

//синхронизация
... .Unlock();

return  Counter;
}


A()
{
st_Counter(e_increment);
}

~A()
{
st_Counter(e_decrement);
}
};

A a;

int N=A::st_Counter();

N=a.st_Counter();


Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 08-12-2009 06:22 » 

Спасибо за информацию)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines