powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию-член
9 сообщений из 9, страница 1 из 1
Указатель на функцию-член
    #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
Указатель на функцию-член
    #39612781
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IridzeЯ понимаю суть ошибки, но не могу понять реализацию ее решения.

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

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

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

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

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

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

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

Так вы ещё и читать не умеете... В задании НЕ сказано, что указатель должен быть на
функцию-член. Котлеты - отдельно, мухи - отдельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Указатель на функцию-член
    #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
Указатель на функцию-член
    #39613075
Iridze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,Вы правы, про лямбды я не слышала еще. Мне будет очень приятно, если когда будет время Вы сможете вникнуть в проблему.
Пока попробую сама переделать.
...
Рейтинг: 0 / 0
Указатель на функцию-член
    #39613173
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Iridze,
ну тут точно никакие указатели на функции члены не нужны , функция pervaya должна быть static а не virtual. и тогда ты сможешь использовать указатель на обычную функцию.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию-член
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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