C ++ виртуальное наследование с абстрактным классом для реализации некоторых математических функций - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблемы с домашним заданием. Задача состоит в том, чтобы реализовать файлы, включенные в main. cpp, чтобы программа работала. main. cpp - это файл, который мы получаем от нашего учителя - мы не можем вносить в него изменения. В конце этого написано желаемый результат. (примечание: перегруженных операторов быть не должно).

Это то, что я сделал до сих пор: https://wandbox.org/permlink/ffzkdaVoYK8Qovic

Я не могу заставить его работать должным образом. Я не знаю, что я делаю неправильно:

  1. Должна быть какая-то ошибка с Дифференциалом. Учитель сказал, что нам не нужно использовать метод clone (), поэтому я этого не сделал, но когда я делаю это в конструкторе вместо setF, я получаю ошибку сегментации. То же самое происходит в функции в (), когда я пытаюсь вернуть результат в соответствии с формулой - и я не понимаю, почему это происходит.

  2. Вместо этого я получаю -5 из 5 (см. вывод ниже основного. cpp). Какая-то математическая ошибка? Я не могу определить это.

  3. У меня такое чувство, что моя классовая иерархия действительно плохая. Что должно быть вместо этого? (Исходя из лекции, должно быть виртуальное наследование, множественное наследование и решение проблемы алмазов - но, ну, это только мое предположение.) Я также получаю некоторые предупреждения при компиляции, и я их не исправляю, потому что я думаю, что я просто неправильно ли была иерархия, и если я ее исправлю, проблема исчезнет.

  4. В общем, что я могу исправить в своем коде, чтобы сделать его лучше?

Вот главное. 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
--------------------------------------------------------------------------------
*******************************************************************************/


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