Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию-член / 9 сообщений из 9, страница 1 из 1
10.03.2018, 14:26
    #39612779
Iridze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
Писала программу в которой надо было найти минимальный корень второй производной. Она отлично работала, но меня попросили сделать эту программу через классы и я столкнулась с одной проблемой.
Ошибку выдает в файле Class.cpp на строчках 19, 20, 29,30 там, где я вызываю функцию "pervaia" (одна и та же ошибка): "Class::pervaia": нестандартный синтаксис; используйте "&", чтобы создать указатель на член.

Я понимаю суть ошибки, но не могу понять реализацию ее решения.

Буду очень благодарна, если мне кто-то сможет помочь.

Вот так сейчас выглядит программа.

Class.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#ifndef AbstractClass_h
#define AbstractClass_h
class Class
{
public:
	typedef double(Class::* ykaz)(double);
	virtual double pervaia(double x)=0;
	double neww (double a, double b);
	double func(ykaz y, double x); 
};

#endif



Class.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include "stdafx.h"
#include "Class.h"
#include <iostream>

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;
	}



main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include "stdafx.h"
#include <iostream>
#include "Class.h"

using namespace std;

class MyClass : public Class {
	virtual double pervaia(double x)
	{
		return pow(x, 4) + pow(x, 3);
	}
};


int main()
{
	MyClass l;
	cout << "Input the interval: " << '\n';
	cout << "MIN: " << l.neww(3,6) << endl;
	system("pause");
    return 0;
}
...
Рейтинг: 0 / 0
10.03.2018, 14:41
    #39612781
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
IridzeЯ понимаю суть ошибки, но не могу понять реализацию ее решения.

Выкинуть ykaz. Вообще.
В функции func вызывать pervaia непосредственно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2018, 14:55
    #39612785
Iridze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
Dimitry Sibiryakov, проблема именно в том, что надо через typedef делать
...
Рейтинг: 0 / 0
10.03.2018, 15:02
    #39612790
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
Iridzeпроблема именно в том, что надо через typedef делать

Это несовместимо с "через классы".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2018, 15:22
    #39612793
Iridze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
Dimitry Sibiryakov, в задании точно сказано:

Написать программу, которая реализует перебор значений с целью поиска некоторого значения в соответствии с индивидуального задания, приведенного в таблице. Требуемое значение может быть найдено путем проверки промежуточных значений функции (или первой / второй производной). Следует использовать указатель на функцию, для которого определить typedef.

Создать класс для решения задания. Класс должен содержать по крайней мере две функции-члена - функцию, которая возвращает значение в соответствии с индивидуального задания, а также чисто виртуальную функцию, которая вызывается из предыдущей и определяет левую часть уравнения или функцию для исследования (в соответствии с заданием).

Класс расположить в отдельном заголовочном файле. В соответствующем файле реализации осуществить определение одной из двух функций класса.

В другой единице трансляции создать производный класс с определением конкретной функции, подлежащей исследованию. В функции main () создать объект производного класса и осуществить выполнение индивидуального задания.

Примечание: Для вычисления первой (второй) производной следует добавить отдельные функции-члены базового класса.
...
Рейтинг: 0 / 0
10.03.2018, 19:17
    #39612843
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
Iridzeв задании точно сказано

Так вы ещё и читать не умеете... В задании НЕ сказано, что указатель должен быть на
функцию-член. Котлеты - отдельно, мухи - отдельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.03.2018, 16:01
    #39613001
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
IridzeПисала программу в которой надо было найти минимальный корень второй производной. Она отлично работала, но меня попросили сделать эту программу через классы и я столкнулась с одной проблемой.
Ошибку выдает в файле Class.cpp на строчках 19, 20, 29,30 там, где я вызываю функцию "pervaia" (одна и та же ошибка): "Class::pervaia": нестандартный синтаксис; используйте "&", чтобы создать указатель на член.

Я понимаю суть ошибки, но не могу понять реализацию ее решения.

Буду очень благодарна, если мне кто-то сможет помочь.

Вот так сейчас выглядит программа.

Class.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#ifndef AbstractClass_h
#define AbstractClass_h
class Class
{
public:
	typedef double(Class::* ykaz)(double);
	virtual double pervaia(double x)=0;
	double neww (double a, double b);
	double func(ykaz y, double x); 
};

#endif



Class.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include "stdafx.h"
#include "Class.h"
#include <iostream>

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;
	}



main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include "stdafx.h"
#include <iostream>
#include "Class.h"

using namespace std;

class MyClass : public Class {
	virtual double pervaia(double x)
	{
		return pow(x, 4) + pow(x, 3);
	}
};


int main()
{
	MyClass l;
	cout << "Input the interval: " << '\n';
	cout << "MIN: " << l.neww(3,6) << endl;
	system("pause");
    return 0;
}




если тебе так нужны указатели на методы, лучше используй вместо них лямбды. будет проще в разы. если с лямбдой раньше не имела дел, не используй захват, особенно неявный и особенно по ссылке.

в суть твой проблемы не вникал , позже смогу сказать что там не так...
...
Рейтинг: 0 / 0
11.03.2018, 21:13
    #39613075
Iridze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
MasterZiv,Вы правы, про лямбды я не слышала еще. Мне будет очень приятно, если когда будет время Вы сможете вникнуть в проблему.
Пока попробую сама переделать.
...
Рейтинг: 0 / 0
12.03.2018, 06:42
    #39613173
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию-член
Iridze,
ну тут точно никакие указатели на функции члены не нужны , функция pervaya должна быть static а не virtual. и тогда ты сможешь использовать указатель на обычную функцию.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию-член / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]