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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с Qwt - Не хочет на вход подаваться функция экземпляра класса  (Прочитано 3737 раз)
stukselbax
Гость
« : Февраль 10, 2011, 20:19 »

Доброго времени суток!
Дан класс (точнее взят из примеров Qwt)
Код:
class FunctionData: public QwtSyntheticPointData
{
public:
    FunctionData(double(*y)(double)):
        QwtSyntheticPointData(1000),
        d_y(y)
    {
    }

    virtual double y(double x) const
    {
        return d_y(x);
    }

private:
    double(*d_y)(double);
};
Создаю дальше класс плота (за кривоту прошу прощения).
Код:
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
class tdcsplot : public QwtPlot
{
private:
    double _E0, _E2, _Theta1, _Dphi;
    int _points;
    bool _fba, _fbamec, _sba, _za;
    double qFba (double x);
    double qFbaMec (double x);
public:
    tdcsplot(double e0, double e2, double theta1, double dphi, int points, bool FBA, bool FBAMEC, bool SBA, bool ZA);
};
Приватные переменные - это параметры, которые влияют на поведения графика(ов).
Приватные функции - соответствующие функции которые по заданным параметрам и по значению x выдают значение y.
В кострукторе tdcsplot(...) создаю кривые, и пытаюсь им присвоить данные следующим образом :
Код:
    if (_fba)
    {
        QwtPlotCurve *cFba = new QwtPlotCurve("First Bourne Approximation");
        cFba->setRenderHint(QwtPlotItem::RenderAntialiased);
        cFba->setPen(QPen(Qt::red));
        cFba->attach(this);
        cFba->setData(new FunctionData(this->qFba));//ругается здесь
    }
Компилятор говорит буквально следующее :
tdcsplot.cpp: In constructor ‘tdcsplot::tdcsplot(double, double, double, double, int, bool, bool, bool, bool)’:
tdcsplot.cpp:45:50: ошибка: нет подходящей функции для вызова ‘FunctionData::FunctionData(<unresolved overloaded function type>)’
functiondata.h:8:5: замечание: претенденты: FunctionData::FunctionData(double (*)(double))
functiondata.h:6:1: замечание: FunctionData::FunctionData(const FunctionData&)


Если в файле *.cpp определить обычную функцию с той же семантикой, и передать её в качестве параметра - всё пучком. Но проблема тогда в другом - в этой функции нельзя обратиться к полям класса tdcsplot.
Подскажите, почему класс FunctionData не хочет на вход принимать функцию, которая является методом класса?
Записан
stukselbax
Гость
« Ответ #1 : Февраль 10, 2011, 22:22 »

Решил проблему следующим способом.
В исходной задаче дано 4 разных метода. каждому из них на вход подаются одни и теже параметры. но вычисляются они по разному. поэтому вначале я сделал 4 разных класса, и 5 - FunctionData, в который бы я передавал функцию объекта одного из классов как параметр. Но так сделать не получилось (так и не знаю почему нельзя передать функцию объекта в конструктор), то решил все 4 класса сделать подобно FunctionData (наследовал от QwtSyntheticPointData, доопределял конструкторы). И действительно помогло(проблемка была только в том, что в QwtSyntheticPointData функция y() определена как const, и теперь все функции моего класса - const, иначе компилятор ругается в духе:
ошибка: passing ‘const fbamec’ as ‘this’ argument of ‘double fbamec::skalyr2D(double, double, double)’ discards qualifiers).
Берут меня смуты, по поводу того, что неверно это делать все функции класса как const. Уж хотелось бы решение найти поэлегантнее(с использованием FunctionData класса)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Февраль 16, 2011, 01:07 »

а определить double(*y)(double) через typedef и его использовать пробовали? результат тот же?

зы. вообще не есть хорошо в с++ таким образом функции использовать, имхо вместо этого создать класс для вычислений с виртуальным методом намного элегантнее.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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