У меня проблемы с домашним заданием. Задача состоит в том, чтобы реализовать файлы, включенные в main. cpp, чтобы программа работала. main. cpp - это файл, который мы получаем от нашего учителя - мы не можем вносить в него изменения. В конце этого написано желаемый результат. (примечание: перегруженных операторов быть не должно).
Это то, что я сделал до сих пор: https://wandbox.org/permlink/ffzkdaVoYK8Qovic
Я не могу заставить его работать должным образом. Я не знаю, что я делаю неправильно:
Должна быть какая-то ошибка с Дифференциалом. Учитель сказал, что нам не нужно использовать метод clone (), поэтому я этого не сделал, но когда я делаю это в конструкторе вместо setF, я получаю ошибку сегментации. То же самое происходит в функции в (), когда я пытаюсь вернуть результат в соответствии с формулой - и я не понимаю, почему это происходит.
Вместо этого я получаю -5 из 5 (см. вывод ниже основного. cpp). Какая-то математическая ошибка? Я не могу определить это.
У меня такое чувство, что моя классовая иерархия действительно плохая. Что должно быть вместо этого? (Исходя из лекции, должно быть виртуальное наследование, множественное наследование и решение проблемы алмазов - но, ну, это только мое предположение.) Я также получаю некоторые предупреждения при компиляции, и я их не исправляю, потому что я думаю, что я просто неправильно ли была иерархия, и если я ее исправлю, проблема исчезнет.
В общем, что я могу исправить в своем коде, чтобы сделать его лучше?
Вот главное. cpp (оно также есть в ссылке на мое решение):
#include "Fun.h"
#include "Elementary.h"
#include "Compound.h"
#include "Differential.h"
#include <iostream>
int main()
{
std::cout << "=====-===== 2 =====-=====" << std::endl;
Fun * lfun = Linear::create()->a(2.)->b(-1.); // This is ax + b = 2x-1
Fun * sfun = new Sinus;
std::cout << lfun->value(0.1) << " " << lfun->value(0) << std::endl;
std::cout << sfun->value(0.1) << " " << sfun->value(0) << std::endl;
std::cout << "=====-===== 2 =====-=====" << std::endl;
Fun * qbase = Quadratic::create()->a(1)->b(0.)->c(-4.);
Fun * qfun = qbase->clone(); // Cloning
std::cout << qbase->value(0.1) << " " << qbase->value(0) << std::endl;
std::cout << qfun->value(0.1) << " " << qfun->value(0) << std::endl;
delete qbase;
std::cout << qfun->value(0.1) << " " << qfun->value(0) << std::endl;
std::cout << "=====-===== 2 =====-=====" << std::endl;
Differential diff(0.01); // 0.01 is h
std::cout << "value of differential from lfun in 1.0 = " << diff.from(lfun)->in(1) << std::endl;
std::cout << "value of differential from qfun in 2.1 = " << diff.from(qfun)->in(2.1) << std::endl;
std::cout << "value of differential from sfun in 0.12 = " << diff.from(sfun)->in(0.12) << std::endl;
std::cout << "=====-===== 1 =====-=====" << std::endl;
Fun* comp = new Compound(lfun, qfun);
std::cout << "value of compound function " << comp->value(2) << std::endl; // Result from: qfun( lfun( 2 ) )
delete lfun;
delete qfun;
delete sfun;
std::cout << "=====-===== 1 =====-=====" << std::endl;
std::cout << "Compound func still works: " << comp->value(2) << std::endl;
delete comp;
}
/*********************************** OUTPUT ************************************
--------------------------------------------------------------------------------
=====-===== 2 =====-=====
-0.8 -1
0.0998334 0
=====-===== 2 =====-=====
-3.99 -4
-3.99 -4
-3.99 -4
=====-===== 2 =====-=====
value of differential from lfun in 1.0 = 2
value of differential from qfun in 2.1 = 4.2
value of differential from sfun in 0.12 = 0.992792
=====-===== 1 =====-=====
value of compound function 5
=====-===== 1 =====-=====
Compound func still works: 5
--------------------------------------------------------------------------------
*******************************************************************************/