Я начал изучать 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;
Хорошо придумывать задачи, тренировать фантазию, но нужно еще и выполнять осмысленные действия, а для этого во первых нужно иметь представление с какой сущностью имеешь дело и составлять логическую аюстракцию и т.д. и т.п. Но если не обратить на все это внимание и концентрироваться только на ваш код, то:
ваши классы никак не используют закрытый член базового класса productSpeed
, а сам базовый класс Factory
в своем методе только инициализирует его значением количества руда. так что:
productSpeed
и количество руда для всех обьектов должно изменяться по ходу добычи, а если нет, то оно не должно быть частью обьекта, а быть статическим членом.Ваши производные классы абсолютно бессмысленные в таком виде. Если же они существуют только для того, чтобы выразить какая это шахта, то лучше просто в базовом классе написать геттер(или сам конструктор) который для каждого значения quantityProduct
выдал бы вид шахты. Так что:
С вашего позволения пропущу обсуждение по поводу класса Furnace
и перейду к программе:
когда вы хотите работать с обьектами производного класса через базовый класс, лучше это делать через указатель или ссыльку базового класса, иначе вы срезаете данные обьекта наследника. В вашем случаи таких данных у наследников нет, но вы можете в любой момент их добавлять, и тогда логика вашего кода будет не той, что вы ожидали...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не понимаю как реализовать QTreeView с checkboxКак обработать событие установки и снятия "галочки"
Например я получаю из очереди сообщение и хочу его разослать всем потокамЯ думал про общую память, но вроде вдруг не все потоки успеют использовать...
Есть ли аналог unix socket в windows? Типа такого как в линукс и unix
Задача: Надо написать функцию который находит в строке цифры и заменяет их на десятичные кодыНапример "aaa'6'xxx" на "aaa54xxx"