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

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

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

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

01.11.2011, 18:24. Просмотров 1183. Ответов 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());
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2011, 18:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция как параметр метода класса (C++):

Функция как аргумент шаблонного метода класса - C++
Пытаюсь передать функцию для сравнения в сортировке слиянием, но что-то не получается. Подскажите, как исправить этот код, чтобы сортировка...

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

Функция - метода класса для определения совпадения имени человека с некоторым заданным - C++
Объявите класс TMan, создающий тип – человека. Элементы – данные класса – имя, возраст человека. Предусмотрите конструкторы класса: ...

Как можно использовать фактический параметр у метода? - C++
ситуация примерно такая: class A { int a; public : int get_a() { return a; } };

Вызов метода класса из метода другого класса - C++
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd, bufwr; unsigned char tx_index,...

Функция как параметр - C++
Нужна помощь.... Проблема такая: есть функция которая рисует график математической функции ранее обьявленной, например: float f(float...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
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 ) );
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
01.11.2011, 18:40 #3
Или.

C++
1
void SGraph::DrawGraphPixels(const std::function<float(float)>& func);
0
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 нужно?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
01.11.2011, 18:55 #5
serginhold, #include <functional> при условии поддержки стандарта С++11.
0
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 19:07  [ТС] #6
ForEveR, нету такого в Qt, нашел в гугле страничку, где написано что Qt будет поддерживать C++11 с версии 5.0
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.
0
Сыроежка
Заблокирован
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.
Молодой человек, если не знаете С++, то не учите знатоков как жить!
0
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))
0
Сыроежка
Заблокирован
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.
0
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 20:26  [ТС] #11
Сыроежка, да функцию класса я хочу вызвать, уже устал ее вызывать, я думал это и так понятно, а вызов в main просто для примера, что работает.
Как вариант, создать файл с функциями, и инклудить его, НО мне все такие интересно почему вызов функции из класса не работает..
0
Сыроежка
Заблокирован
01.11.2011, 20:39 #12
Цитата Сообщение от serginhold Посмотреть сообщение
Сыроежка, да функцию класса я хочу вызвать, уже устал ее вызывать, я думал это и так понятно, а вызов в main просто для примера, что работает.
Как вариант, создать файл с функциями, и инклудить его, НО мне все такие интересно почему вызов функции из класса не работает..
Как я уже сказал, функция класса должна вызываться с помощью синтаксиса обращения к члену класса. ТО есть в прототипе вашей функции, которая пытается ее вызвать, этот параметр описан как общая внешняя функция, а нужно описать как указатель на функцию -член класса. А потому вызывать ее через объект этого класса. То есть просто вызывать функцию, если она не статический член класса, без указания объекта нельзя. Ведь функция должна получить параметр this.
0
serginhold
2 / 2 / 0
Регистрация: 20.10.2011
Сообщений: 15
01.11.2011, 20:46  [ТС] #13
Сыроежка, а кратко кодом можешь тоже самое написать? (особенно про это: "а нужно описать как указатель на функцию -член класса")

хотя я сейчас попробовал прописать static перед функцией, и заработало оО
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2011, 20:46
Привет! Вот еще темы с ответами:

Класс как параметр другого класса - C++
Зачем использовать один класс как параметр другого, пример: class A {} class B {private: A Peremennaya;} И в чем разница: ...

Передать метод класса как параметр - C++
Есть класс A, у него есть метод B, как метод B подсунуть в конструктор std::thread? Что-то типа такого class A { void B{ ... } ...

Как сделать, чтобы функция класса могла работать с обьектами другого класса - C++
есть класс к примеру class One и класс к примеру class Two нужно чтобы элемент функция класса One могла работать в обьектами класа...

Параметр шаблона класса как собственный тип данных - C++
Приветствую. Такой вопрос: как перегрузить операторы класса-шаблона, где в качестве аргумента шаблона выступает собственный тип данных....


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

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

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