![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| andrew_121 |
|
||||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
есть такой класс:
из него выведен такой:
при запуске вот что выводит:
из этого понятно что программа рушится обрабатывая конструктор базового класса. где ступил? linux, g++ Это сообщение отредактировал(а) andrew_121 - 25.1.2010, 08:40 -------------------- Удалил аккаунт. Прощайте! |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нельзя в конструкторе прямо или косвенно вызывать чисто-виртуальные методы.. для (всех) виртуальных функций действует правило - вызывается тело виртуальной функции базового класса, так как наследник еще не сформирован.. Это сообщение отредактировал(а) mes - 25.1.2010, 09:50 |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
mes, так "thread_func()" это статический метод. т.е. в потомке он будет(должен) вызывать переопределенный метод потомка. или не так?
в общем, как исправить? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Обязательно через void* передавать? Так всё работает. Значит проблема в использовании.
-------------------- вопросов больше чем ответов |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
а если так?
Это сообщение отредактировал(а) Alca - 25.1.2010, 10:31 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
andrew_121, у тебя run вызывается в конструкторе
|
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
где именно? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так в этой статической вызывается виртуальная можно применить "статическую виртуализацию" (CRTP Patern) если полиморфизм не нужен либо стартер-враппер или принимать функциональный объект. в любом случае перепроектировка класса. |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
да. pthread_create() требует указатель на функцию типа void* (*)(void*) точно! потомок же еще не создан. сейчас проверю. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Леопольд |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
В конструкторе thread_base передаётся this в pthread_create. Тут потенциальная ошибка. Сначала создаются базовые классы, потом наследники. В конструкторе thread_base можно считать созданной только базовую часть объекта а значит в vtbl нет указателей на переопределённые функции потомка. Поэтому, прямо или косвенно, никак нельзя вызвать то чего ещё нет. По всей видимости именно такая попытка и делается. Но ничего не мешает вызвать pthread_create из конструктора последнего потомка. Не стоит расценивать как предложение реализовать таким образом. Сам я бы так не сделал
Это сообщение отредактировал(а) Леопольд - 25.1.2010, 11:12 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
добавил в базовый класс метод start(), и все заработало.
но любопытно. каким образом можно реализовать запуск потока из конструктора предка, без функциональных объектов? один из выходов. Добавлено через 58 секунд да, все верно. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
понятно. всем спасибо! вопрос закрыт. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |