С++, ООП Семинар 4 Рябова Анна Сергеевна
Задание 3: символьное дифференцирование Реализуйте абстрактный класс Expression с чисто виртуальными методами Expression* diff(); и void print(); и отнаследуйте от него классы Number (число), Variable (переменная), Add (сумма двух выражений), Sub (разность двух выражений), для котоых напишите реализацию этих методов. Пример Expression *e = new Add(new Number(1), new Variable('x')); std::cout diff(); de->print(); std::cout
Защита подключения В Си и C++ директивы #include guards называется macro guard (макрозащита) это особая конструкция, применяемая для избежания проблем с «двойным подключением» при использовании директивы компилятора #include. Двойное подключение File «grandfather.h» class foo { int member; }; File «father.h» #include "grandfather.h File «child.c» #include "grandfather.h" #include "father.h" Здесь к файлу «child.c» напрямую подключаются две копии заголовочного файла «grandfather.h». Это может вызвать ошибку компиляции, так как класс foo явным образом определяется дважды.
Применение #include guards File «grandfather.h» #ifndef H_GRANDFATHER #define H_GRANDFATHER class foo { int member; }; #endif File «father.h» #include "grandfather.h« File «child.c» #include "grandfather.h" #include "father.h" В даном примере, первое включение файла «grandfather.h» вызывает макроопределение H_GRANDFATHER. Далее, когда к «child.c» подключается «grandfather.h» второй раз, проверка #ifndef выдаёт ошибку, и препроцессор пропускает #endif, таким образом избегая второго определения class foo. В результате программа компилируется корректно.