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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
#1

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

01.11.2011, 18:24. Просмотров 1158. Ответов 12
Метки нет (Все метки)

Есть класс с таким методом:
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());
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2011, 18:24     Функция как параметр метода класса
Посмотрите здесь:
Функция как аргумент шаблонного метода класса C++
C++ Функция - метода класса для определения совпадения имени человека с некоторым заданным
Как можно использовать фактический параметр у метода? C++
Функция как параметр C++
Передать метод класса как параметр C++
C++ Класс как параметр другого класса
Как сделать, чтобы функция класса могла работать с обьектами другого класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
47 / 45 / 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++
C++ Ошибка при вызове метода класса в методе другого класса
Классы: как из статического метода обратиться к статической переменной класса C++

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru