use '&' to create a pointer to member

203
18 марта 2018, 21:31

Error C3867 'Class::pervaia': non-standard syntax; use '&' to create a pointer to member Не могу понять место, куда я должна поставить & Я понимаю ,что в строчке

otv = func(pervaia, a);

функция pervaia должна иметь передаваемое значение в (), когда у меня была написана эта же программа, но не разделенная на классы, то все работало. Буду очень благодарна за помощь.

1.сpp

#include "stdafx.h"
#include "Class.h"
#include <iostream>    
using namespace std;
class MyClass : public Class {
public:
double pervaia(double x)
    {
        return pow(x, 4) + pow(x, 3);
    }
};
int main()
{    
    double  a, b;
    MyClass l;
    cout << "Input the interval: " << '\n';
    cout << "a=";
    cin >> a;
    cout << "b=";
    cin >> b;
    cout << '\n';
    cout << "MIN: " << l.neww(a, b) << endl;
    system("pause");
    return 0;
}

Class.cpp

#include "stdafx.h"
#include <iostream>
#include "Class.h"
using namespace std;
double Class::func(ykaz y, double x)
{
    double deltaX = 0.0000001;
    return (((this->*y)(x + deltaX) - (this->*y)(x)) / deltaX);
    }
    double Class::neww(double a, double b) {
    double deltaX = 0.0000001;
    double otv, min, otvv, otvvv, x, aa, c;
    otv = func(pervaia, a);
    otvv = func(pervaia, a + deltaX);
    otvvv = (otvv - otv) / deltaX;
    min = otvvv;
    aa = a;
    for (int i = 0; i <= b - a; i++)
    {
        x = aa;
        cout << "x=" << x << '\t';
        otv = func(pervaia, x);
        otvv = func(pervaia, x + deltaX);
        otvvv = (otvv - otv) / deltaX;
        cout << otvvv << endl;
        if (min > otvvv)
        {
            min = otvvv;
        }
        aa++;
    }
    return min;
}

Class.h

#ifndef Class_h
#define Class_h
class Class
{
public:
    typedef double(Class::*ykaz)(double);
    double func(ykaz y, double);
    double neww(double a, double b);
    virtual double pervaia(double x)=0;
};
#endif
Answer 1

Вызывайте вот так

otv = func(&Class::pervaia, a);
Answer 2

Вы определили указатель на функцию член класса прямо в классе

 typedef double(Class::*ykaz)(double);

и функцию

double func(ykaz y, double);

т.е. в аргументе функции должен быть не указатель на функцию, а указатель на функцию-член

а потом вызываете

func(pervaia, a);

компилятор не видит ожидаемый указатель на функцию-член, потому что вы передаете просто указатель на функцию pervaia

или вызывайте так

func(&Class::pervaia, a);  (зависит от вашего кода, будет ли это правильно)

или же перепешите в классе обявление

class Class
{
public:
   typedef  double (*ykaz)(double);
...
};

чтоб ykaz был типом указателья на функцию, а не указателем на функцию-член

READ ALSO
Как подать напряжение к pin&#39;у другой Arduino?

Как подать напряжение к pin'у другой Arduino?

Есть две Arduino Mega 2560, соединенные между собой через TX и RXКо второй Arduino нет доступа по USB, только через первую Arduino

201
Как исправить ошибку: &ldquo;warning C6385: Переполнение буфера при записи в &hellip; &rdquo;?

Как исправить ошибку: “warning C6385: Переполнение буфера при записи в … ”?

// Массив должен выводится с допстолбцом в начале и после этого выдавать запрос на продолжение работы в программе или выход

393
C++ классы, преобразовать программу

C++ классы, преобразовать программу

Был код, калькулятор римских и арабских чиселНужно его преобразовать, чтобы был в 3 файла main

219