Russian Qt Forum

Программирование => С/C++ => Тема начата: Oaks от Апрель 11, 2013, 15:46



Название: Некорректный прототип указателя функции
Отправлено: 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&)'
Что я не так делаю и можно ли все-таки выполнить присвоение ?


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

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

Ну и для вызова по указателю экзепляр класса тоже будет нужен


Название: Re: Некорректный прототип указателя функци
Отправлено: Oaks от Апрель 11, 2013, 16:28
Ну и для вызова по указателю экзепляр класса тоже будет нужен
Не понял,можно подробнее ?


Название: Re: Некорректный прототип указателя функции
Отправлено: mutineer от Апрель 11, 2013, 16:50
Вот так не вызовется:
myfunc()

Надо будет делать например так:
(this->*myfunc)(...);


Название: Re: Некорректный прототип указателя функци
Отправлено: m_ax от Апрель 11, 2013, 16:57
Ну и для вызова по указателю экзепляр класса тоже будет нужен
Не понял,можно подробнее ?
А какой вообще в этом смысл? Ну, в смысле, зачем понадобился такой указатель? Не проще ли, непосредственно, вызывать метод creatEditor?


Название: Re: Некорректный прототип указателя функци
Отправлено: Oaks от Апрель 12, 2013, 10:21
Цитировать
А какой вообще в этом смысл? Ну, в смысле, зачем понадобился такой указатель? Не проще ли, непосредственно, вызывать метод creatEditor?
Это простой, искусственный пример, на котором показана суть проблемы - мое непонимание как работать с таким типом указателей.


Название: Re: Некорректный прототип указателя функци
Отправлено: m_ax от Апрель 12, 2013, 10:36
Цитировать
А какой вообще в этом смысл? Ну, в смысле, зачем понадобился такой указатель? Не проще ли, непосредственно, вызывать метод creatEditor?
Это простой, искусственный пример, на котором показана суть проблемы - мое непонимание как работать с таким типом указателей.
Посмотрите в сторону std::function http://en.cppreference.com/w/cpp/utility/functional/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;
}
 


Название: Re: Некорректный прототип указателя функци
Отправлено: Oaks от Апрель 12, 2013, 18:13
Цитировать
Посмотрите в сторону std::function http://en.cppreference.com/w/cpp/utility/functional/function (http://en.cppreference.com/w/cpp/utility/functional/function)
Например, для вашего случая, это будет выглядеть примерно так:
  ...
 
Спасибо за совет.Буду разбираться.