Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запретить менять спецификатор доступа, для наследника 
V
    Опции темы
SABROG
  Дата 10.3.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Может показаться, что вопрос по Qt, но на самом деле по C++ ;)

В Qt есть класс QThread. Часто делают ошибки, переопределяя метод run() из protected секции в своих наследниках и выносят его в public секцию. Затем вызывают thread->run(), вместо thread->start(). Вопрос в том, как запретить наследнику менять спецификатор доступа или вызывать метод, чтобы при этом оставалась возможность его переопределять.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 10.3.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  10.3.2010,  14:32 Найти цитируемый пост)
как запретить наследнику менять спецификатор доступа или вызывать метод,

написать крупными буквами в документации ))

Добавлено через 1 минуту и 55 секунд
или заменить run на что то типа doOnRun smile

Это сообщение отредактировал(а) mes - 10.3.2010, 15:36


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 10.3.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(mes @  10.3.2010,  15:36 Найти цитируемый пост)
или заменить run на что то типа doOnRun smile

Ага doNotRunJustReimplement() ;)

Цитата(mes @  10.3.2010,  15:36 Найти цитируемый пост)
написать крупными буквами в документации ))

Предложил троллям, но ведь у нас мало кто документацию читает.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SenkraD
Дата 10.3.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



SABROG,  как вариант сделать шаблонную обёртку или
примменить CRTP (я более за 2-й вариант), в которой вызывать QThread::start

имхо, тут без шаблоноа никак!!!

Можеш примерный код накидать того, что получить хочеш?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 10.3.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(SenkraD @  10.3.2010,  15:43 Найти цитируемый пост)
Можеш примерный код накидать того, что получить хочеш?


Код

class MyThread : public QThread
{
Q_OBJECT
public:
    MyThread(QObject* parent) : QThread(parent)
    {
    }

    ~MyThread() {}

    void run()
    {
        exec();
    }
}


Хочу, чтобы при таком наследовании компилятор выругнулся и не дал мне переместить run() из protected в public.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
17dufa
Дата 10.3.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



SABROG, а сделать его private и virtual? не подойдет? можно тока переопределять, вызвать - фиг.

Это сообщение отредактировал(а) 17dufa - 10.3.2010, 19:11
PM MAIL   Вверх
mes
Дата 10.3.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(17dufa @  10.3.2010,  18:11 Найти цитируемый пост)
а сделать его private и virtual? не подойдет? можно тока переопределять, вызвать - фиг.

разве ?  http://codepad.org/NBCI8JST    


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 10.3.2010, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(SenkraD @  10.3.2010,  15:43 Найти цитируемый пост)
имхо, тут без шаблоноа никак!!!

 smile 
но есть одно НО!
Qt-шная сигнал-слотовая модель не работает с шаблонами smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



А я бы и на шаблонный вариант посмотрел.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 11.3.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  10.3.2010,  23:40 Найти цитируемый пост)
А я бы и на шаблонный вариант посмотрел. 

можно например так :
Код

template <class T>
class ThreadT {
 T& m_worker;

 public:
    ThreadT (T& worker) : m_worker(worker) {}

    void start ();
    void terminate ();

  private:
    void run() { if (!m_worker ()) terminate();  }
};

struct Worker 
{
   Worker (int, double, char);
   bool operator () () {}

};

int main ()
{
     Worker worker (1, 2., 'A');
     ThreadT<Worker> thread(worker);
     thread.start();
}




--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 11.3.2010, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



угу. только работать не будет.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(mes @ 11.3.2010,  00:59)
можно например так :

А переопределение run() где тут?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 11.3.2010, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(andrew_121 @  11.3.2010,  00:06 Найти цитируемый пост)
угу. только работать не будет.

а поподробнее ? что Вам в коде не понравилось то smile


Цитата(SABROG @  11.3.2010,  00:53 Найти цитируемый пост)
А переопределение run() где тут? 

в роли Run выступает функтор, в примере Worker ..
Если хочется Run можно им заменить operator (), но по сути это лишнее smile





--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 11.3.2010, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(mes @  11.3.2010,  02:39 Найти цитируемый пост)
а поподробнее ? что Вам в коде не понравилось то

дело в том, что это дело, нужно для работы в Qt. а для работы метаобъектной системы, нельзя использовать шаблоны.

Добавлено @ 02:44
Цитата(mes @  11.3.2010,  02:39 Найти цитируемый пост)
что Вам в коде не понравилось то

мне то все понравилось. но вот moc, ваши старания не оценит smile 
mes, если интересно, мы с SABROG подискутировали по этому поводу тут: http://forum.vingrad.ru/index.php?showtopi...t&p=2113872


Это сообщение отредактировал(а) andrew_121 - 11.3.2010, 02:59


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 11.3.2010, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(andrew_121 @  11.3.2010,  01:43 Найти цитируемый пост)
мне то все понравилось. но вот moc, ваши старания не оценит smile 

а зачем шаблоному классу ThreadT сигнал-слоты ? А Worker подходит под вкус moca, так что, имхо, полный порядок smile



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.