| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Запретить менять спецификатор доступа |
| Автор: SABROG 10.3.2010, 15:32 |
| Может показаться, что вопрос по Qt, но на самом деле по C++ ;) В Qt есть класс QThread. Часто делают ошибки, переопределяя метод run() из protected секции в своих наследниках и выносят его в public секцию. Затем вызывают thread->run(), вместо thread->start(). Вопрос в том, как запретить наследнику менять спецификатор доступа или вызывать метод, чтобы при этом оставалась возможность его переопределять. |
| Автор: SABROG 10.3.2010, 15:42 |
Ага doNotRunJustReimplement() ;) Предложил троллям, но ведь у нас мало кто документацию читает. |
| Автор: SenkraD 10.3.2010, 15:43 |
| SABROG, как вариант сделать шаблонную обёртку или примменить CRTP (я более за 2-й вариант), в которой вызывать QThread::start имхо, тут без шаблоноа никак!!! Можеш примерный код накидать того, что получить хочеш? |
| Автор: SABROG 10.3.2010, 15:49 | ||
Хочу, чтобы при таком наследовании компилятор выругнулся и не дал мне переместить run() из protected в public. |
| Автор: 17dufa 10.3.2010, 19:11 |
| SABROG, а сделать его private и virtual? не подойдет? можно тока переопределять, вызвать - фиг. |
| Автор: mes 10.3.2010, 21:36 | ||
разве ? http://codepad.org/NBCI8JST |
| Автор: andrew_121 10.3.2010, 22:04 |
но есть одно НО! Qt-шная сигнал-слотовая модель не работает с шаблонами |
| Автор: SABROG 11.3.2010, 00:40 |
| А я бы и на шаблонный вариант посмотрел. |
| Автор: mes 11.3.2010, 00:59 | ||
можно например так :
|
| Автор: andrew_121 11.3.2010, 01:06 |
| угу. только работать не будет. |
| Автор: SABROG 11.3.2010, 01:53 | ||
А переопределение run() где тут? |
| Автор: mes 11.3.2010, 02:39 |
а поподробнее ? что Вам в коде не понравилось то в роли Run выступает функтор, в примере Worker .. Если хочется Run можно им заменить operator (), но по сути это лишнее |
| Автор: andrew_121 11.3.2010, 02:43 |
дело в том, что это дело, нужно для работы в Qt. а для работы метаобъектной системы, нельзя использовать шаблоны. Добавлено @ 02:44 мне то все понравилось. но вот moc, ваши старания не оценит mes, если интересно, мы с SABROG подискутировали по этому поводу тут: http://forum.vingrad.ru/index.php?showtopic=293991&view=findpost&p=2113872 |
| Автор: mes 11.3.2010, 03:12 | ||
а зачем шаблоному классу ThreadT сигнал-слоты ? А Worker подходит под вкус moca, так что, имхо, полный порядок |
| Автор: andrew_121 11.3.2010, 03:32 | ||
| наверное я вас не совсем верно понял. или вы... вот я смотрю на ваш код, и абсолютно не въезжаю, как тут использовать QThread ? нет, т.е. я представляю, но moc откажется работать. а вы утверждаете что нет. в общем запутали вы меня... Добавлено через 3 минуты и 49 секунд
я понимаю это так. но повторюсь, моc`у это не понравится. |
| Автор: mes 11.3.2010, 10:05 | ||||||
значит я не до конца понял задание.. Я думал вопрос состоит в иной, чем на данный момент имеется, организации библиотеки т.е пример был ориентирован на избавление от перегрузки Run у QThread. Можно конечно и без шаблонов, с использованием Функционального объекта с виртуальной функцией,
ну и использовать так :
|
| Автор: SABROG 11.3.2010, 12:11 | ||
А если этот код разделить на 2 части, то какая из них будет принадлежать библиотеке, а какую будет писать сам пользователь класса? Еще такой вопрос, не будет ли проблемы с функциональным объектом, когда библиотека попытается получить адрес функции для передачи этого адреса в API целевой системы? |
| Автор: mes 11.3.2010, 12:32 | ||||
ну так разделено же.. верхний блок кода условно-библиотечный , а нижний условно-пользовательский.
А зачем ей (АПИ) адрес функции фо (функционального объекта) ? пусть Thread свою функцию и отдает, в которой будет вызывать уже фо |
| Автор: SABROG 11.3.2010, 12:37 |
| Понял. А как организовать доступ к членам класса QThread из функционального объекта? Делать их friend'ами? |
| Автор: mes 11.3.2010, 12:48 | ||
у thread есть публичный интерфейс (start, terminate, priority.. ) - вот им и нужно пользоваться.. Если вопрос как получать thread в котором сейчас работает фо, то смотрите часть кода после // или Если ж речь о данных необходимых для работы фо, то они должны быть членами фо, а не thread`a, что и пытался показать конструктором в коде. Вобщем вопрос непонятен.. если ответил не на то , перефразируйте, плиз |
| Автор: SABROG 11.3.2010, 13:05 |
| В принципе у QThread есть несколько protected членов, с которыми необходимо работать. Например exec(), чтобы запускать или не запускать локальный цикл событий. Как я понял "operator ()" что-то типа безымянного метода? Это мало чем отличается от "obj.someMethod()". В некотором смысле это тоже самое, что и ссылка на метод класса &MyClass::myMethod() и ссылки на экземпляр объекта класса. А если вообще утрировать, то это обычный callback? |
| Автор: mes 11.3.2010, 13:35 | ||||||
ну а к thread`у она какое отношение имеет ? Qt запихнула все в один класс к ним и обращайтесь
ага, просто удобно вызывать.. можно любую другую функцию, или даже их набор.
зачем ерез окно лезть, когда дверь открыта Callback это применение. любая функция вызваная полиморфно является по сути колбяком |
| Автор: SABROG 11.3.2010, 13:42 | ||
Пользовательский объект должен быть на базе QObject'a, чтобы обеспечить межпоточное общение между объектами, да и доступ нужен к сигналам и слотам объекта QThread, чтобы подключение сделать. |
| Автор: mes 11.3.2010, 13:50 | ||
пользовательский объект это фо , вот он на базе QObjecta, если нужно, пусть будет |