класс — C ++ Ошибка: нет подходящей функции для вызова

Я пытаюсь решить квадратное уравнение, используя метод деления пополам. При попытке оценить корни я получаю эту ошибку: «нет подходящей функции для вызова».

#include "assign4.h"#include <iostream>

using namespace std;

int main(int argc, char * argv[]){
solution s;
double root;

cout << "Enter interval endpoints: ";
cin >> s.xLeft >> s.xRight;

cout << "Enter tolerance: ";
cin >> s.epsilon;

root = s.bisect (s.xLeft, s.xRight, s.epsilon, s.f, s.error);

if (!(s.error))
cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root);
else
cout << "The solution of a quadratic equation with coefficients: " << endl;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
cout << "has not been found." << endl;

return 0;
}

Ошибка возникает там, где root = … похоже, у меня проблема с моей функцией f, но я не понимаю, что не так. Следующие два фрагмента кода являются моими классами и файлами реализации классов. Мы только начали работать с классами, поэтому я не уверен, лежит ли там моя проблема или просто в приведенном выше коде.

#ifndef ASSIGN4_H
#define ASSIGN4_H

class solution {

public:
double xLeft, xRight;
double epsilon;
bool error;

double bisect(double, double, double, double f(double), bool&);
double f(double);
};
#endif // ASSIGN4_H

////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////

#include "assign4.h"#include <iostream>
#include <cmath>

using namespace std;

double solution::bisect (double xLeft, double xRight, double epsilon, double func(double), bool& error) {
double xMid;
double fLeft, fRight;
double fMid;

fLeft = f(xLeft);
fRight = f(xRight);

error = (fLeft * fRight) > 0;
if (error)
return -999.0;

while (fabs (xLeft - xRight) > epsilon) {
xMid = (xLeft + xRight) / 2.0;
fMid = f (xMid);

if (fMid == 0.0)
return xMid;
else if (fLeft * fMid < 0.0)
xRight = xMid;
else
xLeft = xMid;

cout << "New Interval is [" << xLeft << ", " << xRight << "]" << endl;
}

return (xLeft + xRight) / 2.0;
}

double solution::f (double x) {
return ((5 * pow(x,2.0)) + (5 * x) + 3);
}

2

Решение

Если вы хотите использовать указатели на функции-члены.

+ Изменить

double bisect(double, double, double, double f(double), bool&);

в

double bisect(double, double, double, double (solution::*f)(double), bool&);

в декларации и определении.

Изменить звонок с

root = s.bisect (s.xLeft, s.xRight, s.epsilon, s.f, s.error);

в

root = s.bisect (s.xLeft, s.xRight, s.epsilon, &solution::f, s.error);

Это то, что я успешно компилирую и связываю для меня.

 #include <iostream>
#include <typeinfo>
#include <math.h>

using namespace std;

class solution {

public:
double xLeft, xRight;
double epsilon;
bool error;

double bisect(double, double, double, double (solution::*f)(double), bool&);
double f(double);
};

using namespace std;

double solution::bisect (double xLeft, double xRight, double epsilon, double (solution::*func)(double), bool& error) {
double xMid;
double fLeft, fRight;
double fMid;

fLeft = (this->*func)(xLeft);
fRight = (this->*func)(xRight);

error = (fLeft * fRight) > 0;
if (error)
return -999.0;

while (fabs (xLeft - xRight) > epsilon) {
xMid = (xLeft + xRight) / 2.0;
fMid = (this->*func)(xMid);

if (fMid == 0.0)
return xMid;
else if (fLeft * fMid < 0.0)
{
xRight = xMid;
fRight = fMid;
}
else
{
xLeft = xMid;
fLeft = fMid;
}

cout << "New Interval is [" << xLeft << ", " << xRight << "]" << endl;
}

return (xLeft + xRight) / 2.0;
}

double solution::f (double x) {
return ((5 * pow(x,2.0)) + (5 * x) + 3);
}

int main(int argc, char * argv[]){
solution s;
double root;

cout << "Enter interval endpoints: ";
cin >> s.xLeft >> s.xRight;

cout << "Enter tolerance: ";
cin >> s.epsilon;

root = s.bisect (s.xLeft, s.xRight, s.epsilon, &solution::f, s.error);

if (!(s.error))
cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root) << endl;
else
{
cout << "The solution of a quadratic equation with coefficients: " << endl;
// cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
cout << "has not been found." << endl;
}
return 0;
}
1

Другие решения

4-й параметр — это указатель на функцию,

double bisect(double, double, double, double f(double), bool&);

Когда вы вызываете эту функцию:

root = s.bisect (s.xLeft, s.xRight, s.epsilon, s.f, s.error);

Пока член фантастики double f(double) это не тот же тип, что и этот параметр, потому что это функция-член C ++, а не статическая, поэтому при компиляции этот параметр-член добавляется параметром this.

введите добавить статическое ключевое слово в функцию.

3

Синтаксис для указателя на функцию обычно такой: double (*f)(double), Кроме того, вы пытаетесь передать функцию-член через указатель на функцию-не-член. Поскольку ваша функция не использует переменные-члены, простейшим решением было бы сделать ее static:

class solution {
// ...
static double f(double);
};
2

Я считаю, что это связано с вашей функцией обратного вызова. Обычно вы получаете такую ​​ошибку компилятора, когда используете неверный вызов функции. Если вам нужна функция обратного вызова такого типа, вы можете обратиться к указателям на функции.

http://www.cprogramming.com/tutorial/function-pointers.html

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector