Russian Qt Forum
Ноябрь 15, 2024, 22:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Некорректный прототип указателя функции  (Прочитано 4195 раз)
Oaks
Гость
« : Апрель 11, 2013, 15:46 »

Написал свой класс delegate.h , производный стандартного делегата,добавив  переменную myfunc, указатель на функцию :
delegate.h
Код:
class Delegate : public QItemDelegate
{
Q_OBJECT
public:
  Delegate(QObject *parent = 0);

  QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem & option ,const QModelIndex &index) const;
  ...
  ...
 private:
   QWidget  *(*myfunc)(QWidget *parent, const QStyleOptionViewItem & option, const QModelIndex &index)  const;
 };
Компилятор дает ошибку:
Код:
delegate.h:50:92: error: 'const' and 'volatile' function specifiers on 'myfunc' invalid in field declaration
Убрал const в описании myfunc
было:
QWidget *(*myfunc)(QWidget *parent, const QStyleOptionViewItem & option, const QModelIndex &index) const;
стало:
QWidget *(*myfunc)(QWidget *parent, const QStyleOptionViewItem & option, const QModelIndex &index);
Компилятор не ругался.
Затем в конструкторе класса попытался проинициализировать myfunc:
Код:
Delegate::Delegate(QObject *parent):QItemDelegate(parent)
{
  myfunc =createEditor;
}
На что выдается:
Код:
delegate.cpp: In constructor 'Delegate::Delegate(QObject*)':

delegate.cpp:32:11: error: argument of type 'QWidget* (Delegate::)(QWidget*, const QStyleOptionViewItem&, const QModelIndex&)const' does not match 'QWidget* (*)(QWidget*, const QStyleOptionViewItem&, const QModelIndex&)'
Что я не так делаю и можно ли все-таки выполнить присвоение ?
Записан
mutineer
Гость
« Ответ #1 : Апрель 11, 2013, 15:52 »

у тебя определен указатель на обычную фукнция, а передаешь ты в нее метод класса. Нужно изменить тип указателя на QWidget  *(Delegate::*myfunc)(...) const

Инициализация неправильная:
myfunc = &Delegate::createEditor;

Ну и для вызова по указателю экзепляр класса тоже будет нужен
« Последнее редактирование: Апрель 11, 2013, 16:02 от mutineer » Записан
Oaks
Гость
« Ответ #2 : Апрель 11, 2013, 16:28 »

Ну и для вызова по указателю экзепляр класса тоже будет нужен
Не понял,можно подробнее ?
Записан
mutineer
Гость
« Ответ #3 : Апрель 11, 2013, 16:50 »

Вот так не вызовется:
myfunc()

Надо будет делать например так:
(this->*myfunc)(...);
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #4 : Апрель 11, 2013, 16:57 »

Ну и для вызова по указателю экзепляр класса тоже будет нужен
Не понял,можно подробнее ?
А какой вообще в этом смысл? Ну, в смысле, зачем понадобился такой указатель? Не проще ли, непосредственно, вызывать метод creatEditor?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Oaks
Гость
« Ответ #5 : Апрель 12, 2013, 10:21 »

Цитировать
А какой вообще в этом смысл? Ну, в смысле, зачем понадобился такой указатель? Не проще ли, непосредственно, вызывать метод creatEditor?
Это простой, искусственный пример, на котором показана суть проблемы - мое непонимание как работать с таким типом указателей.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Апрель 12, 2013, 10:36 »

Цитировать
А какой вообще в этом смысл? Ну, в смысле, зачем понадобился такой указатель? Не проще ли, непосредственно, вызывать метод creatEditor?
Это простой, искусственный пример, на котором показана суть проблемы - мое непонимание как работать с таким типом указателей.
Посмотрите в сторону std::function http://en.cppreference.com/w/cpp/utility/functional/function

Например, для вашего случая, это будет выглядеть примерно так:
Код
C++ (Qt)
#include <functional>
#include <string>
#include <iostream>
 
class my_class {
public:
   my_class() {
       f_ptr = &my_class::print;
   }
 
   void message() {
       f_ptr(this, "Hello member function");
   }
 
   void print(const std::string &msg) { std::cout << msg << std::endl; }
 
private:  
   std::function<void (my_class*, const std::string& )> f_ptr;
};
 
int main()
{
   my_class mc;
   mc.message();
 
   return 0;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Oaks
Гость
« Ответ #7 : Апрель 12, 2013, 18:13 »

Цитировать
Посмотрите в сторону std::function http://en.cppreference.com/w/cpp/utility/functional/function
Например, для вашего случая, это будет выглядеть примерно так:
  ...
 
Спасибо за совет.Буду разбираться.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.