Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > статический класс


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

например 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 (что не очень удобно)

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

Автор: Mayk 12.1.2006, 19:36
Цитата(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();

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

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

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


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

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

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

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



если не сложно - можно пример (я не встречал такое smile

Автор: DeadSoul 12.1.2006, 22:04
zss, синглетон Мейерса описан во втором посте.

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

Автор: Mayk 12.1.2006, 22:23
Синглтон Мейерса:
Код

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

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

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


что-то я не вкурил - как он удалится, если конструктор и деструктор private

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

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

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


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

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)