![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Доброго времени суток!
Допустим есть класс А и класс B.У класса Б не дефолтный конструктор,с чем справляюсь успешно,проблема в том,что при вызове конструктора(оператора new) наследующего класса нужно вызвать его конструткор,потом внутренюю приватную функцию,и потом только конструктор наследуемого класса.Т.е.: 1.вызываем конструктор класса А 2. вызываем функцию 3. вызываем конструткор класса Б
Нужно что-то типа этого.Такое вообще реально? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
так сделать нельзя
конструкторы вызываются от предка к потомку и в списке инициализации может быть только инициализация мемберов (ну и предков) Добавлено через 1 минуту и 46 секунд если вы точно опишите проблему - зачем это нужно - возможно мы сможем предложить вам более удобный дизайн - публичное наследование далеко не всегда правильное решение |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
в общем суть проблемы:
1.нужно выделить пул в памяти 2.заполнить структуру с параметрами 3.вызвать конструктор класса B с передачей в него этой сруктуры. Конкретнее - это инсталяция Хавока. Мне нужно уместить все эти 3 действия в 1 функцию,желательно без передачи структуры в конструткор класса А(в нем и должна быть эта функция,а лучше - этой функцией должен быть его конструктор),при этом унаследовать все методы класса B. Это сообщение отредактировал(а) DarkKnight - 15.10.2008, 08:32 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну так можно сделать статическую функцию, которая вернёт структуру для инициализаиции B:
-------------------- qqq |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
попробывал,эта функция даже не успевает вызваться(
|
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
В общем я написал 2 класса - менеджер памяти и класс мира.
но если есть идеи по этой теме,буду раз прочитать и испробывать) |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
а можно код привести? а то уж очень странно, что функция не вызывается -------------------- qqq |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
вызываться то она вызывается,но после вызова конструктора класса B,а нужно до. По сути так и должно быть,следуя логике кода - вызов функции из класса A.но т.к. конструктор класса А не вызван еще,она видимо игнорируется(функция),вызов конструктора класса B,вызов конструктора класса A.
код был такой(образно):
|
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
функция подготовки структуры должна быть статической, т.к. на момент вызова конструктора B объекта класса A ещё нету и вызов его нестатического метода - плохая идея для отладки я бы посоветовал использовать какие-нибудь более детерминированные события, чем вылет ![]() вывод на консоль, например, или MessageBox, если дело в Windows происходит -------------------- qqq |
||||
|
|||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
это хорошо конечно,но не в закрытом классе)а вылет именно в нем.а между конструкторами месажбокс я не умею ставить)) ну эффект то на мой взгляд будет тот же?если функция раньше пропускалась,то статическая не будет пропускаться? З.Ы. я вроде нечайно кномпу репорт нажал,я не спецально,все ок))) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если в вашей функции происходит обращение к полям объекта, то ее вызов будет сопровождаться вылетом. Со статической функцией такого не будет, так как ей не передается указатель на объект. Это сообщение отредактировал(а) mes - 16.10.2008, 01:18 |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
Это программирование, а не гадание на картах. Тут ничего пропускаться не может. Я не знаю что говорит по этому поводу стандарт, но обычная логика и эксперимент, подсказывают что если в невиртуальном методе класса не вызывать других методов и не обращаться к полям класса, то этот метод можно вызывать до инициализации объекта. Но лучше не рисковать и сделать его все-таки статическим Не правильно решил, это значит только то, что у тебя программа вылетает до того как управление дойдет до точки останова. |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Сейчас не поленился - переделал немного класс,функцию сделал статической,поставил cout в начале и конце функции и в конструкторе класса A,не вывелось ничего.
|
|||
|
||||
Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
DarkKnight,
$ cat main.cpp
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |