|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.07.2015, 17:14 | #11 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
static функция должна будет откуда-то добыть екземпляр класса, т.е. кто-то должен его до этого создать (либо создавать в самой static функции).
По сути, правильная формулировка что конструктор класса будет вызван не позднее возврата из static функции. Можете почитать на досуге: https://en.wikipedia.org/wiki/Singleton_pattern |
18.07.2015, 00:10 | #12 |
Пользователь
Регистрация: 16.07.2015
Сообщений: 31
|
Все-таки насчет конструктора при вызове static функции хотелось уточнить. Я не сказал сразу. static функция EDU::Work (...) использует шаблон template <class T>
И из нее вызывается другая не static-функция, этого же класса которая в свою очередь обращается к переменным класса как на запись, так и на чтение и некоторые переменные уже должны быть проинициализированы, когда до них вызов доходит. Получается, что к этому моменту уже должен быть вызван конструктор ? Вызывается так: reinterpret_cast<T*>(history->user)->DoWork(......); где DoWork не статичная функция моего класса EDU, вызванная из статичной EDU::Work (...) , T* - это некий другой класс, который дочерний от моего EDU. Т.е. вместо шаблона class History : public EDU, history->user это данные внешней никак структуры не связанной с моим классом EDU. Может быть тут каким то чудесным образом создается объект моего класса и вызывается конструктор через объект дочернего класса History ? p.s. Объект дочернего класса History не создается до этого вызова. Получается, что в этом вызове все происходит. Я не до конца понимаю каким образом. |
18.07.2015, 02:27 | #13 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
если history->user НЕ указывает на объект типа Т, то все красиво сломается.
А если указывает, то значит его кто-то создал. https://msdn.microsoft.com/ru-ru/library/e0w9f63b.aspx http://en.cppreference.com/w/cpp/lan...interpret_cast http://habrahabr.ru/post/106294/ |
18.07.2015, 04:04 | #14 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Код:
Код:
Код:
Вообще Код:
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Последний раз редактировалось Perchik71; 18.07.2015 в 04:13. |
19.07.2015, 14:46 | #15 | |
Пользователь
Регистрация: 16.07.2015
Сообщений: 31
|
Цитата:
Спасибо. Теперь кажется я понял. Оказалось еще до этого было выполнено history->user = reinterpret_cast<UINT32>(new T); а потом, уже reinterpret_cast<T*>(history->user)->DoWork(......); Только я не понял, как можно ссылку на объект класса преобразовывать в UINT32 ? Почитал, что UINT32 это структура. Не понимаю, что происходит именно при преобразовании этом. p.s. Если я создаю объект дочернего класса, и через него вызываю public функцию родительского класса, в которой идет обращение к его членам, то конструктор родительского класса вызывается? Последний раз редактировалось robix; 19.07.2015 в 14:50. |
|
19.07.2015, 19:21 | #16 | ||
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Цитата:
Цитата:
никакой объект не строиться, он уже построен малышом на этапе создания.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
|
||
19.07.2015, 20:29 | #17 |
Форумчанин
Регистрация: 01.06.2015
Сообщений: 497
|
Только рекомендую преобразовывать в void*, а не в UINT32, т.к. если потом нужно будет собирать 64-битную программу с этого кода, то будут проблемы.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
|
19.07.2015, 21:33 | #18 | |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Цитата:
/// Лови рекомендашку
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Последний раз редактировалось Perchik71; 19.07.2015 в 21:43. |
|
21.07.2015, 11:51 | #19 |
Пользователь
Регистрация: 16.07.2015
Сообщений: 31
|
Спасибо.
Подскажите, я правильно понял. Допустим есть: Class F_CLASS {......}; S_CLASS *S; S = reinterpret_cast<S_CLASS>(new F_CLASS); На более низком уровне S это некая запись в памяти, в которой есть информация о том, что это указатель, также о том на какой тип данных он указывает, и адрес на который она указывает. Но по этому адресу в данный момент будет раположен объект класса F. Примерно так? |
21.07.2015, 18:11 | #20 |
Форумчанин
Регистрация: 01.06.2015
Сообщений: 497
|
S, это просто указатель на адрес в памяти, где должен быть объект класса.
Многие думают, что класс на низком уровне, это что-то невероятное. Сейчас я попробую объяснить, что это не так. Допустим, у нас есть класс: Код:
Код:
Код:
Код:
Код:
Код:
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вызов функции из класса | mc13 | Общие вопросы по Java, Java SE, Kotlin | 11 | 08.02.2015 20:52 |
Вызов функции из одного класса кнопкой из другого класса | lexflax | Qt и кроссплатформенное программирование С/С++ | 1 | 12.12.2014 21:48 |
Вызов глобальной функции из объекта класса | Darthriddikc | Общие вопросы C/C++ | 3 | 22.12.2013 21:03 |
C# Вызов метода без создания объекта. Предотвращение изменения фокуса. | Colder M | Помощь студентам | 3 | 03.05.2011 23:42 |
Вызов методов объекта из функции? | jojahti | Общие вопросы C/C++ | 3 | 03.08.2009 16:57 |