Смешанная практика ООП в C++
Задачи соединяют базовый класс с наследниками,
перечисление для режима или роли и хранение
объектов через std::unique_ptr
или std::shared_ptr.
Сделайте enum class Role с константами
Viewer и Editor. Сделайте класс
Account с полем role и методом
canEdit, который возвращает true
только для Role::Editor. Сделайте
AdminAccount, наследующий Account,
где canEdit всегда true.
Выведите три результата для зрителя, редактора
и администратора.
Сделайте абстрактный класс Shape
с area и классы Rect,
Circle. Сделайте enum class Tag
с Plain и Marked.
Храните std::vector<std::unique_ptr<Shape>>
из двух фигур. Выведите сумму площадей
и значение Tag::Marked как число.
Сделайте класс Line с полями sku
и price. Сделайте базовый Cart
с методом total(lines) и DiscountCart,
который возвращает сумму price минус 10,
но не ниже 0. Дан вектор:
std::vector<Line> items = {
Line("a", 30),
Line("b", 5),
};
Выведите итог для Cart и для DiscountCart.
Сделайте enum class Op с Add
и Sub. Сделайте базовый Calc
с виртуальным eval(a, b, op)
и SafeCalc, который для Sub
не опускается ниже 0. Выведите
eval(5, 7, Op::Sub) для обоих классов.
Сделайте абстрактный Storage
с size и ListStorage
над std::vector<std::string>.
Держите std::shared_ptr<Storage>
в двух переменных, добавьте две строки
через одну копию указателя и выведите
size и use_count.
Сделайте enum class Status с New,
Done. Сделайте Task с полем
статуса и виртуальным markDone.
Сделайте UrgentTask, который при
завершении выводит "urgent".
Храните std::unique_ptr<Task>,
завершите задачу и выведите статус.
Сделайте класс Portal с полем
std::string name и enum class Mode
с Guest и User. Метод
greet возвращает "hello guest"
или "hello " с именем. Создайте
два std::unique_ptr<Portal> для обоих
режимов и выведите оба приветствия.