LINUX.ORG.RU

Как объединить шаблоны и наследование

 ,


2

4

Попросили решить, но я не знаю как :(

Спасибо тому, кто подскажет идею.

Есть main.cpp, нужно чтобы он работал:

#include "quadrature.h"

#include <cmath>
#include <iostream>
#include <memory>
#include <string>

int main() {
    using F = decltype(cos);

    std::string input;
    std::cin >> input;
    std::unique_ptr<IntegrationMethod<F>> method;
    if (input == "rectangle")
        method.reset(new RectangleRule<F>);
    else
        method.reset(new TrapezoidalRule<F>);

    double x, y;
    std::cin >> x >> y;

    int n;
    std::cin >> n;

    std::cout << method->Integrate(cos, x, y, n) << "\n";
    std::cout << method->Integrate(sin, x, y, n) << "\n";
}

Я не знаю как именно реализовать три недостающих класса. Вот мой вариант, я знаю что он не правильный и не компилируется:

#ifndef __QUADRATURE_H__
#define __QUADRATURE_H__

template <typename F>
class IntegrationMethod
{
public:
	virtual double Integrate(F func, double x, double y, int n)
	{
		return 0;
	}
protected:
};

template <typename F>
class RectangleRule : public IntegrationMethod<F>
{
public:
	double Intergrate (F func, double x, double y, int n) override
	{
	    double value = 0;
		double step = (y - x)/n;
	    for (double i = x+step/2; i < y; i += step)
	    {
	        value += func(i);
	    }
	    value *= step;
	    return value;
	}
};

template <typename F>
class TrapezoidalRule : public IntegrationMethod<F>
{
public:
	double Intergrate (F func, double x, double y, int n) override
	{
	    double value = 0;
		double step = (y - x)/n;
	    for (double i = x; i < y; i += step)
	    {
	        value += func(i);
	    }
	    value *= step;
	    return value;
	}
};
#endif

★★★★★

Ответ на: комментарий от fsb4000

Не вижу смысла в шаблонном базовом классе. Ты же не пишешь обобщенный алгоритм. Передавай указатель на функцию или std::function

four_str_sam
()
Ответ на: комментарий от four_str_sam

main.cpp нельзя менять.

Задача выглядит так:

Вася изучил два метода приближенного интегрирования функций — метод прямоугольников и метод трапеций. Он даже написал программу, которая будет получать на вход метод интегрирования, концы отрезка и число отрезков разбиения, и будет вычислять интеграл от функций. Напишите недостающие классы IntegrationMethod, RectangleRule и TrapezoidalRule с реализацией методов интегрирования, чтобы Васина программа заработала. В них должна быть реализована функция Integrate, принимающая на вход функцию для интегрирования, концы отрезка (double) и число частей для разбиения (int).

fsb4000 ★★★★★
() автор топика

Попросили решить, но я не знаю как :(

А зачем было сачковать занятия? Переходите на другой факультет, где преподаватель не просит выполнить задание.

andreyu ★★★★★
()

ТС, чего именно ты не понимаешь. Не говори только, что всего. Если не понимаешь всего, то уходи со своего факультета, это будет лучшим вариантом. Сам учился, знаю тех, кто всего не понимал, но цеплялся изо всех сил. Заканчивалось обидным отчислением на третьем или даже на четвертом курсе, одного отчислили вообще перед сдачей диплома, имей это ввиду.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от anonymous

почему компилятор не ругнулся?

Вот мой вариант, я знаю что он не правильный и не компилируется:
и не компилируется

Он ругнулся.

xaizek ★★★★★
()
Ответ на: комментарий от fsb4000

Без сопливых разобрались. Тема помечена как решенная.

А вот теперь представь, что придет такой же умник как ты в эту тему и будет полгода втыкать чего тебе было надо. Потому что ты вполне эгоистично решил свою проблему, но решения не привёл.

asaw ★★★★★
()
Ответ на: комментарий от asaw

решение в первом посте.

Методы нужно называть одинаково.

После того как методы стали называться Integrate, программа скомпилировалось и выдала верный ответ на тестовых значениях.

Ещё раз спасибо xaizek за то что заметил это, и дал лаконичный ответ.

fsb4000 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.