Форум программистов, компьютерный форум CyberForum.ru

Функция как параметр метода класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 18:24     Функция как параметр метода класса #1
Есть класс с таким методом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void SGraph::DrawGraphPixels(float func)  /* ! Сюда надо передать какую либо математическую функцию */
{
    for (int i=this->margin; i<=this->pm->width()-this->margin; i++)
    {
        float x = (i-qx)/px;
        
        x = func(x); /* ! Вот здесь эта мат. функция должна использоваться */
 
        this->p->drawPoint(xs((i-qx)/px),  ys(x));
    }
}
/* Как это сделать ? */
Причем функция описана в другом классе/месте, вообщем хочу сделать так:
C++
1
2
3
4
5
SGraph *holst = new SGraph(500, 500, -10.0, 10.0, -10.0, 10.0);
 
holst->DrawGraphPixels(func); /* ! т.е. сюда нужно передать функцию: float func(float z){};  */
 
canvas->setPixmap(*holst->getPixmap());
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
01.11.2011, 18:28     Функция как параметр метода класса #2
Цитата Сообщение от serginhold Посмотреть сообщение
Есть класс с таким методом:

Причем функция описана в другом классе/месте, вообщем хочу сделать так:
C++
1
2
3
4
5
SGraph *holst = new SGraph(500, 500, -10.0, 10.0, -10.0, 10.0);
 
holst->DrawGraphPixels(func); /* ! т.е. сюда нужно передать функцию: float func(float z){};  */
 
canvas->setPixmap(*holst->getPixmap());
Объявите свой метод следующим образом

C++
1
void SGraph::DrawGraphPixels( float func( float ) );
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.11.2011, 18:40     Функция как параметр метода класса #3
Или.

C++
1
void SGraph::DrawGraphPixels(const std::function<float(float)>& func);
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 18:54  [ТС]     Функция как параметр метода класса #4
Сыроежка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// в .h файле:
void DrawGraphPixels(float func(float x));
// в .cpp файле
void SGraph::DrawGraphPixels(float func(float x)) /* если честно мне это кажется полным бредом, не может быть так легко */
{
    for (int i=this->margin; i<=this->pm->width()-this->margin; i++)
    {
        float x = (i-qx)/px;
        x = func(x);
 
        this->p->drawPoint(xs((i-qx)/px), ys(x));
    }
}
 
// попытка вызова в программе:
#include "SGraph.h"
...
SGraph *holst = new SGraph(500, 500, -10.0, 10.0, -10.0, 10.0);
holst->DrawGraphPixels(func(0)); /* не работает, пишет ошибки, может вызываю не правильно
Ошибки:
1: no matching function for call to 'SGraph::DrawGraphPixels(float)'
2: candidates are: void SGraph::DrawGraphPixels(float (*)(float)) */
ForEveR
я в Qt пишу, там точно такое есть? std::function, пишет вообще кучу ошибок, может чего подключить через include нужно?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.11.2011, 18:55     Функция как параметр метода класса #5
serginhold, #include <functional> при условии поддержки стандарта С++11.
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 19:07  [ТС]     Функция как параметр метода класса #6
ForEveR, нету такого в Qt, нашел в гугле страничку, где написано что Qt будет поддерживать C++11 с версии 5.0
serejkus
46 / 44 / 4
Регистрация: 31.10.2011
Сообщений: 98
01.11.2011, 19:09     Функция как параметр метода класса #7
Цитата Сообщение от Сыроежка Посмотреть сообщение
Объявите свой метод следующим образом

C++
1
void SGraph::DrawGraphPixels( float func( float ) );
А часом ли не так:
C++
1
void SGraph::DrawGraphPixels( float (*func)( float ) );
Функция DrawGraphPixels в этом случае принимает указатель func на функцию, принимающую float и возвращающую float.
Сыроежка
Заблокирован
01.11.2011, 19:12     Функция как параметр метода класса #8
Цитата Сообщение от serginhold Посмотреть сообщение
Сыроежка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// в .h файле:
void DrawGraphPixels(float func(float x));
// в .cpp файле
void SGraph::DrawGraphPixels(float func(float x)) /* если честно мне это кажется полным бредом, не может быть так легко */
{
    for (int i=this->margin; i<=this->pm->width()-this->margin; i++)
    {
        float x = (i-qx)/px;
        x = func(x);
 
        this->p->drawPoint(xs((i-qx)/px), ys(x));
    }
}
 
// попытка вызова в программе:
#include "SGraph.h"
...
SGraph *holst = new SGraph(500, 500, -10.0, 10.0, -10.0, 10.0);
holst->DrawGraphPixels(func(0)); /* не работает, пишет ошибки, может вызываю не правильно
Ошибки:
1: no matching function for call to 'SGraph::DrawGraphPixels(float)'
2: candidates are: void SGraph::DrawGraphPixels(float (*)(float)) */
ForEveR
я в Qt пишу, там точно такое есть? std::function, пишет вообще кучу ошибок, может чего подключить через include нужно?
А где ваше определение функции func?

И во-вторых, вы подставляете в вызов своей функции SGraph:rawGraphPixels не функцию, а результат выполнения функции func!

Что это за вызов такой?!!!

holst->DrawGraphPixels(func(0));

Что здесь такое в качестве аргумента func( 0 )?!!! Вы ведь должны передать в качестве аргумента не объект, а функцию!

Добавлено через 1 минуту
Цитата Сообщение от serejkus Посмотреть сообщение
А часом ли не так:
C++
1
void SGraph::DrawGraphPixels( float (*func)( float ) );
Функция DrawGraphPixels в этом случае принимает указатель func на функцию, принимающую float и возвращающую float.
Молодой человек, если не знаете С++, то не учите знатоков как жить!
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 19:46  [ТС]     Функция как параметр метода класса #9
Вообщем Qt, проект QWidget, создается по умолчанию класс Widget, в него сую функцию func()
C++
1
2
3
4
5
6
float func(float x); // h
...
float Widget::func(float x) // cpp
{
    return x*x;
}
В конструкторе Widget пишу это:
C++
1
2
3
4
5
canvas = new QLabel(this);
canvas->resize(500,500);
SGraph holst(500, 500, -10.0, 10.0, -10.0, 10.0);
holst.DrawGraphPixels(func); /* здесь ошибка постоянно, что не пиши в классе SGraph */
canvas->setPixmap(*holst.getPixmap());
В классе SGraph:
C++
1
2
3
4
5
//писать так
void SGraph::DrawGraphPixels( float func( float ) );
//или так
void SGraph::DrawGraphPixels( float (*func)( float ) );
//вообще без разницы, если в коде программы не вызывать эту функцию, то прекрасно все компилируется
НО
ошибка компиляции происходит если функцию вызывать именно в классе Widget
Если функцию вызвать в main.cpp, то почему то все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <QtGui/QApplication>
#include "widget.h"
#include "SGraph.h"
 
float f(float x)
{
    return x*x;
}
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
 
    SGraph holst(500, 500, -10.0, 10.0, -10.0, 10.0);
 
    holst.DrawGraphPixels(f);
 
    w.show();
 
    return a.exec();
}
Я если честно разницы в коде вообще не вижу, то что main.cpp и в widget.cpp одно и тоже, но почему то во втором компилятор ругается вот так:
C++
1
2
1: no matching function for call to 'SGraph::DrawGraphPixels(<unresolved overloaded function type>)'
2: candidates are: void SGraph::DrawGraphPixels(float (*)(float))
Сыроежка
Заблокирован
01.11.2011, 19:59     Функция как параметр метода класса #10
Цитата Сообщение от serginhold Посмотреть сообщение
Вообщем Qt, проект QWidget, создается по умолчанию класс Widget, в него сую функцию func()
C++
1
2
3
4
5
6
float func(float x); // h
...
float Widget::func(float x) // cpp
{
    return x*x;
}
В конструкторе Widget пишу это:
C++
1
2
3
4
5
canvas = new QLabel(this);
canvas->resize(500,500);
SGraph holst(500, 500, -10.0, 10.0, -10.0, 10.0);
holst.DrawGraphPixels(func); /* здесь ошибка постоянно, что не пиши в классе SGraph */
canvas->setPixmap(*holst.getPixmap());
В классе SGraph:
C++
1
2
3
4
5
//писать так
void SGraph::DrawGraphPixels( float func( float ) );
//или так
void SGraph::DrawGraphPixels( float (*func)( float ) );
//вообще без разницы, если в коде программы не вызывать эту функцию, то прекрасно все компилируется
НО
ошибка компиляции происходит если функцию вызывать именно в классе Widget
Если функцию вызвать в main.cpp, то почему то все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <QtGui/QApplication>
#include "widget.h"
#include "SGraph.h"
 
float f(float x)
{
    return x*x;
}
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
 
    SGraph holst(500, 500, -10.0, 10.0, -10.0, 10.0);
 
    holst.DrawGraphPixels(f);
 
    w.show();
 
    return a.exec();
}
Я если честно разницы в коде вообще не вижу, то что main.cpp и в widget.cpp одно и тоже, но почему то во втором компилятор ругается вот так:
C++
1
2
1: no matching function for call to 'SGraph::DrawGraphPixels(<unresolved overloaded function type>)'
2: candidates are: void SGraph::DrawGraphPixels(float (*)(float))
В main вы вызываете функцию - не член класса. Поэтому никаких проблем нет. Ваша функция f это обычная внешняя функция. Как я понял, у вас имеется две функции с именем func - одна член класса, а другая внешняя функция. Вы уж как-то разберитесь, что вы хотите вызвать!

То есть, если я правильно понял, в конструкторе в том выражении, в котором вы вызываете функцию, нельзя ее вызывать без объекта класса Widget.
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 20:26  [ТС]     Функция как параметр метода класса #11
Сыроежка, да функцию класса я хочу вызвать, уже устал ее вызывать, я думал это и так понятно, а вызов в main просто для примера, что работает.
Как вариант, создать файл с функциями, и инклудить его, НО мне все такие интересно почему вызов функции из класса не работает..
Сыроежка
Заблокирован
01.11.2011, 20:39     Функция как параметр метода класса #12
Цитата Сообщение от serginhold Посмотреть сообщение
Сыроежка, да функцию класса я хочу вызвать, уже устал ее вызывать, я думал это и так понятно, а вызов в main просто для примера, что работает.
Как вариант, создать файл с функциями, и инклудить его, НО мне все такие интересно почему вызов функции из класса не работает..
Как я уже сказал, функция класса должна вызываться с помощью синтаксиса обращения к члену класса. ТО есть в прототипе вашей функции, которая пытается ее вызвать, этот параметр описан как общая внешняя функция, а нужно описать как указатель на функцию -член класса. А потому вызывать ее через объект этого класса. То есть просто вызывать функцию, если она не статический член класса, без указания объекта нельзя. Ведь функция должна получить параметр this.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2011, 20:46     Функция как параметр метода класса
Еще ссылки по теме:

C++ Класс как параметр другого класса
C++ Функция - метода класса для определения совпадения имени человека с некоторым заданным
Как реализовать вне класса тело метода? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 20:46  [ТС]     Функция как параметр метода класса #13
Сыроежка, а кратко кодом можешь тоже самое написать? (особенно про это: "а нужно описать как указатель на функцию -член класса")

хотя я сейчас попробовал прописать static перед функцией, и заработало оО
Yandex
Объявления
01.11.2011, 20:46     Функция как параметр метода класса
Ответ Создать тему
Опции темы

Текущее время: 18:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru