Есть ли ошибки или проблемы в коде

189
22 августа 2021, 20:50

Я начал изучать C++ ООП. И придумал вот такой пример с фабриками по добыче угля и железа.

    class Factory {
    int productSpeed;
    int quantityProduct;
public:
    int GetQuantityProduct() { return quantityProduct; }
    Factory(int speed) : productSpeed(speed), quantityProduct(0){}
    void Produce() { 
        cout << "Идет добыча ресурса" << endl;
        quantityProduct += productSpeed;
    }
};
class IronFactory : public Factory{
public:
    IronFactory() : Factory(10) {
        cout << "Открытие шахты железной руды!" << endl;
    }
};
class CharcoalFactory : public Factory {
public:
    CharcoalFactory() : Factory(20) {
        cout << "Открытие шахты угля!" << endl;
    }
};
class Furnace {
    int charcoal = 0;
    int ironore = 0;
    int ironingot = 0;
public:
    int GetIronIngot() { return ironingot; }
    Furnace(int ore = 0, int coal = 0) : charcoal(coal), ironore(ore) { }
    void Smelting() {
        if (charcoal < 2 || ironore < 1)
            cout << "Не хватает ресурсов для выплавки" << endl;
        else {
            charcoal -= 2;
            ironore--;
            ironingot++;
        }
    }
    void SmeltingAll() {
        while (ironore >= 1 && charcoal >= 2) {
            ironingot++;
            ironore--;
            charcoal -= 2;
        }
        cout << "Плавка завершена!" << endl;
    }
};

Есть класс Factory в котором определенные поля, конструктор, метод и гетер.

Так же классы IronFactory и CharcoalFactory которые наследуются от Factory.

И класс Furnace который делает из 1 руды железной и 2 угля 1 железный слиток.

Подскажите пожалуйста правильно ли я составил программу по правилам ООП. Если нет то скажите пожалуйста где ошибка и как правильно должно быть.

Вот пример использования фабрик

Factory factoryIron = IronFactory();
Factory factoryCharcoal = CharcoalFactory();
factoryIron.Produce();
factoryCharcoal.Produce();
Furnace furnace = Furnace(factoryIron.GetQuantityProduct(), factoryCharcoal.GetQuantityProduct());
furnace.Smelting();
cout << furnace.GetIronIngot() << endl;
furnace.SmeltingAll();
cout << furnace.GetIronIngot() << endl;
Answer 1

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

ваши классы никак не используют закрытый член базового класса productSpeed

, а сам базовый класс Factory в своем методе только инициализирует его значением количества руда. так что:

  1. Нет смысла держать член productSpeed и количество руда для всех обьектов должно изменяться по ходу добычи, а если нет, то оно не должно быть частью обьекта, а быть статическим членом.

Ваши производные классы абсолютно бессмысленные в таком виде. Если же они существуют только для того, чтобы выразить какая это шахта, то лучше просто в базовом классе написать геттер(или сам конструктор) который для каждого значения quantityProduct выдал бы вид шахты. Так что:

  1. Нет осмысленных действий

С вашего позволения пропущу обсуждение по поводу класса Furnace и перейду к программе:

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

READ ALSO
QTreeView с QCheckBox

QTreeView с QCheckBox

Не понимаю как реализовать QTreeView с checkboxКак обработать событие установки и снятия "галочки"

170
Как получить сообщение всем потокам?

Как получить сообщение всем потокам?

Например я получаю из очереди сообщение и хочу его разослать всем потокамЯ думал про общую память, но вроде вдруг не все потоки успеют использовать...

140
аналог unix socket в windows

аналог unix socket в windows

Есть ли аналог unix socket в windows? Типа такого как в линукс и unix

126
Как заменить символ в строке?

Как заменить символ в строке?

Задача: Надо написать функцию который находит в строке цифры и заменяет их на десятичные кодыНапример "aaa'6'xxx" на "aaa54xxx"

84