Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> статический класс 
:(
    Опции темы
zss
Дата 12.1.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



хотелось бы создать статический класс, который в конструкторе один раз вызывал бы системную функцию,
а после через статические методы можно было бы получать значения (конструктор закрыт)

например GetSystemInfo
Код

class System {
    private :
        SYSTEM_INFO info_;
        static System *system_;

        System () {
            ZeroMemory (&info_, sizeof (SYSTEM_INFO));
            GetSystemInfo (&info);
        }
        ~System () {;}

    public :
        static const System *Instance (){
            if (!system_) system_ = new System;
            return system_;
        }
        unsigned PageSize (void) {
            return info_.dwPageSize;
        }

};



Но тогда придется получать доступ только через Instance (что не очень удобно)

И еще - как тогда удалять этот глобальный объект ?
PM MAIL ICQ   Вверх
Mayk
Дата 12.1.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(zss @ 12.1.2006, 23:28 Найти цитируемый пост)

И еще - как тогда удалять этот глобальный объект ?

Как вариант раз сделать вот так:
Код

        static const System *Instance (){
            static System system_ ;
            return &system_;
        }

и он удалится сам

Как вариант номер два - прочитать про ф-цию atexit.
Добавлено @ 19:39
Цитата(zss @ 12.1.2006, 23:28 Найти цитируемый пост)

Но тогда придется получать доступ только через Instance (что не очень удобно)

мхо
Код

System* sys = System::getInstance();
sys->blabla1(sys->PageSize());
sys->blabla2();

не так уж неудобно


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
zss
Дата 12.1.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(Mayk @ 12.1.2006, 19:36 Найти цитируемый пост)

не так уж неудобно


а как его удалить ?

PM MAIL ICQ   Вверх
Mayk
Дата 12.1.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



1) Он сам удалится при выходе из программы (если использовать синглтон Мейерса, или atexit)
или
2) Сделать ф-цию destroy(), которая будет удалять объект
или
3) открыть ~System().



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
zss
Дата 12.1.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(Mayk @ 12.1.2006, 20:38 Найти цитируемый пост)

если использовать синглтон Мейерса, или atexit



если не сложно - можно пример (я не встречал такое smile
PM MAIL ICQ   Вверх
DeadSoul
Дата 12.1.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



zss, синглетон Мейерса описан во втором посте.

И рекомендую книгу Александреску. Там много про синглетоны


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Mayk
Дата 12.1.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Синглтон Мейерса:
Код

struct System{
        static System& Instance (){
            static System system_ ;
            return system_;
        }
}


ф-ция atexit:
(объект по-прежнему создается при первом обращении.)

Код

#include <iostream>
#include <cstdlib>
using namespace std;
struct System{
        public:
        static System& getInstance(){
                static System* instance = new System();
                return *instance;
        }
        private:
        System(){atexit(deleteMe);  }
        ~System(){ cout << "!!" << endl;  }
        static void deleteMe(){ delete &getInstance();}
};
int main(){System::getInstance();} //вывод программы: !!


зы. о, - комо отказывается принимать указатель на с++ ф-цию в ф-цию atexit

Это сообщение отредактировал(а) Mayk - 12.1.2006, 22:24


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
zss
Дата 13.1.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(Mayk @ 12.1.2006, 22:23 Найти цитируемый пост)

        private:
        System(){atexit(deleteMe);  }
        ~System(){ cout << "!!" << endl;  }
        static void deleteMe(){ delete &getInstance();}


что-то я не вкурил - как он удалится, если конструктор и деструктор private
PM MAIL ICQ   Вверх
blackofe
Дата 13.1.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



zss, а что тебя смущает? прятать конструктор и/или деструктор в приват - обычная практика, если ты не хочешь, чтобы твой объект кто-то создавал/убивал со стороны. и, как ты можешь видеть, здесь этого не происходит - в main происходит вызов статического паблик метода. а поскольку это метот данного класса, то он имеет доступ ко всем приватным методам - в т.ч. и к конструктору и деструктору.
PM MAIL   Вверх
zss
Дата 14.1.2006, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(blackofe @ 13.1.2006, 19:39 Найти цитируемый пост)

zss, а что тебя смущает? прятать конструктор и/или деструктор в приват - обычная практика, если ты не хочешь, чтобы твой объект кто-то создавал/убивал со стороны. и, как ты можешь видеть, здесь этого не происходит - в main происходит вызов статического паблик метода. а поскольку это метот данного класса, то он имеет доступ ко всем приватным методам - в т.ч. и к конструктору и деструктору.


ага... убить его нельзя. А так как это указатель, то при выходе из области видимости он сам не умрет (утечка smile

PM MAIL ICQ   Вверх
Daevaorn
Дата 14.1.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(zss @ 14.1.2006, 02:16 Найти цитируемый пост)

ага... убить его нельзя. А так как это указатель, то при выходе из области видимости он сам не умрет (утечка

Вот так: System(){atexit(deleteMe); } при выходе из main()

PM MAIL WWW   Вверх
blackofe
Дата 17.1.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(zss @ 14.1.2006, 02:16)
ага... убить его нельзя. А так как это указатель, то при выходе из области видимости он сам не умрет (утечка smile

почитай про функцию atexit(). именно она взводится на удаление объекта по выходу из программы. а, как ты сам можешь видеть, с областью видимости для нее все в порядке - вызывает приватную функцию, но поскольку сама вызывается из члена класса (в данном случае - конструктора), то никаких проблем.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.