получение экзэмпляра объекта?

 
0
 
C++
ava
mrgloom | 03.09.2013, 18:02
можете пояснить данный код? точнее подход.

в самом файле где определен класс диалога

CMyDlg& CMyDlg::GetInstance()
{
    static CMyDlg myDlg;
    return myDlg;
}


потом в другом месте (главном диалоге?) вызывается как


CMyDlg::GetInstance().Create( CMyDlg::IDD, m_pMainWnd );


я так понимаю это замена вызова немодального диалога.

т.е. если бы я сделал так

CMain::OnSomeButtonPress()
{
     CMyDlg* pDlg= new CMyDlg();
     pDlg->create(CMyDlg::IDD, m_pMainWnd );
}

то так мне потом в деструкторе CMain пришлось вызывать delete.

Ответы (7)
ava
bsa | 03.09.2013, 17:07 #
Это называется singleton. Используется, когда в программе может быть только один экземляр класса.
ava
mrgloom | 05.09.2013, 09:55 #
что такое static  функция или static переменая в классе понятно, а что такое static object не очень.
непонятно когда объект создаётся и когда уничтожается и какая у него область видимости, ведь получается что то типа глобального объекта?

+ у меня еще при повторном открытие диалога если использовать


CMyDlg& CMyDlg::GetInstance()
{
    static CMyDlg myDlg;
    return myDlg;
}
CMain::OnSomeButtonPress()
{
CMyDlg::GetInstance().Create( CMyDlg::IDD);
}


падает в wincore.cpp line 638, а 1 раз открывается нормально.
ava
bsa | 05.09.2013, 12:37 #
Цитата (mrgloom @  5.9.2013,  10:55 findReferencedText)
непонятно когда объект создаётся и когда уничтожается и какая у него область видимости, ведь получается что то типа глобального объекта?
Объект создается при первом обращении к CMyDlg::GetInstance() (статические объекты внутри функций инициализируются при первом вызове функции).
Уничтожается при завершении приложения (статические объекты деинициализируются в порядке обратном их инициализации - проще говоря, после инициализации деструктор объекта передается в atexit).
Да, синглтон необходим именно для того, чтобы объект был глобальным, но прямого доступа к нему не было - только через метод.
ava
EnergoHokum | 05.09.2013, 12:44 #
Цитата


что такое static  функция или static переменая в классе понятно, а что такое static object не очень



Объект -- та же переменная, только определённая пользователем. Так что разницы между static int other и static UserDefinedClass another, в общем то, никакой и и нет.
ava
baldina | 05.09.2013, 12:49 #
Цитата (mrgloom @  5.9.2013,  09:55 findReferencedText)
что такое static object

в классе это обычная статическая переменная (без разницы какой у неё тип, int или object)
ava
mrgloom | 05.09.2013, 13:52 #
Цитата


Объект создается при первом обращении к CMyDlg::GetInstance()


посмотрел под дебагером, при первом обращении GetInstance()  вызывается консруктор\ происходит инициализация диалога.
при втором обращение ничего не происходит, но по идее измененный диалог так и должен храниться в static переменной, но почему же тогда при втором вызове GetInstance().Сreate происходит падение? возможно потому что при закрытие диалога что то портиться?

причем даже так падает без закрытия диалога, когда вызывается 2 раза.

CMyDlg::GetInstance().Create( CMyDlg::IDD);
CMyDlg::GetInstance().Create( CMyDlg::IDD);


Цитата


Объект -- та же переменная, только определённая пользователем. Так что разницы между static int other и static UserDefinedClass another, в общем то, никакой и и нет. 


ну так то да, только у объекта есть конструктор.
ava
ТарасАтавин | 05.09.2013, 14:17 #
mrgloom, не бывает экземпляров объектов. Бывают экземпляры классов, они же объекты.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить