• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Niestandardowa składnia programu.(C++)

Object Storage Arubacloud
0 głosów
280 wizyt
pytanie zadane 25 sierpnia 2017 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam!

W programie występuje "niestandardowa składnia" oraz problem z konwersja double na double. Błędy linia(27, 31, 35, 44).

Oto kod:

#include <iostream>

class rownania
{
public:
	double multiplication(double a, double b);
	double minuss(double a, double b);
	double add(double a, double b);
	double calculate(double a, double b, double(*f)(double, double));
};

int main()
{
	rownania obiektowe;
	setlocale(LC_ALL, "polish");

	int c;
	double (*f)(double, double);
	std::cout << "1. Dodawanie\n"
		<< "2. Odejmowanie\n"
		<< "3. Mnożenie\n\n"
		<< "Wybierz opcje: ";
	std::cin >> c;
	switch (c)
	{
	case 1:
		f = obiektowe.add;
		break;

	case 2:
		f = obiektowe.minuss;
		break;

	case 3:
		f = obiektowe.multiplication;
		break;
	default:
		break;
	}

	double a, b;
	std::cout << "Wpisz liczby: ";
	std::cin >> a >> b;
	std::cout << std::endl << obiektowe.calculate(a, b, f);

	std::cin.get();
	return 0;
}

double rownania::multiplication(double a, double b)
{
	return a * b;
}
double rownania::minuss(double a, double b)
{
	return a - b;
}
double rownania::add(double a, double b)
{
	return a + b;
}
double rownania::calculate(double a, double b, double(*f)(double, double))
{
	return f(a, b);
}

 

2 odpowiedzi

+3 głosów
odpowiedź 25 sierpnia 2017 przez vector Dyskutant (9,200 p.)
wybrane 26 sierpnia 2017 przez Sic
 
Najlepsza

Mylisz pojęcia wskaźnika do funkcji a wskaźnika do metody. Teoretycznie oba to wskaźniki, ale fizycznie wskaźniki na metody zajmują dwa razy więcej miejsca niż zwykłe wskaźniki i nie jest możliwa konwersja między nimi.

Zakładając taką definicje klasy

class Foo {
public:
    int bar(int x, int y) {
        return x + y;
    }
};

Wskaźnik powinno zadeklarować się tak.

int (Foo::*ptr)(int, int);

Tak wygląda przypisanie do niego wskaźnika metody bar

ptr = &Foo::bar;

i tak wywoładnie metody schowanej pod tym wskaźnikiem

std::cout << (foo.*ptr)(x, y) << std::endl;

 

komentarz 26 sierpnia 2017 przez Sic Dyskutant (8,510 p.)
Dziękuję, za wyjaśnienie.
0 głosów
odpowiedź 26 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

Można też tak:

using namespace std;
using namespace std::placeholders;
...
	
rownania r;
unsigned c;

function<double (double, double)> fn[] = { 
	bind(&rownania::add, &r, _1, _2), 
	bind(&rownania::minuss, &r, _1, _2), 
	bind(&rownania::multiplication, &r, _1, _2) 
	};
	
cin >> c;
	
if(c < extent<decltype(fn)>::value)
	cout << fn[c](666, 999) << '\n';

 

Podobne pytania

0 głosów
2 odpowiedzi 235 wizyt
pytanie zadane 8 grudnia 2017 w C i C++ przez seba360pl Początkujący (260 p.)
0 głosów
2 odpowiedzi 102 wizyt
pytanie zadane 30 marca w HTML i CSS przez oleksik Użytkownik (610 p.)
0 głosów
2 odpowiedzi 290 wizyt
pytanie zadane 16 listopada 2022 w Python przez niezalogowany

92,682 zapytań

141,583 odpowiedzi

320,071 komentarzy

62,041 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...