-
[cpp] 지금까지 배운 것 실습C++(cpp) 2021. 6. 23. 18:50
커피숍에 가서 커피 주문하는 예제
객체, 클래스만들고 메소드 사용하고 파일 나누는 것까지 공부했다.
coffee.h
#include <iostream> #include <string.h> class Menu { int menu_id; int price; char const* menu_name; public: Menu(); Menu(int price_, char const* menu_name_, int menu_id_); char const* getMenuName() const { return (menu_name); } int getPrice() const { return (price); } int getId() const { return (menu_id); } void printMenu(); }; class MenuBoard { Menu *menus[100]; int menu_num; public: MenuBoard(); MenuBoard(char *menu_name, int price); void printMenu(); void addMenuBoard(char const* menu_name, int price); Menu getMenuByName(char const* menu_name_); }; class Guest{ Menu *menu; char const* guest_name; int wallet; public: Guest(int wallet_, char const* guest_name_); void orderCoffee(MenuBoard const& mb, Menu const& menu); int hasMoney(int price); char const* getGuestName(){ return (guest_name); } void getCoffee(); void getOffShop(); void drinkCoffee(); }; class Cashier{ Menu *new_menu; char const* menu_name; char const* _cashier_name; int price; int id; public: Cashier(char const* cashier_name): _cashier_name(cashier_name){}; int takeAnOrder(const Menu &menu); }; class Barista{ char const* _barista_name; public: Barista(char const* barista_name) : _barista_name(barista_name) {} void brewCoffee(Menu const& menu); }; class Cafe { Cashier _cashier; MenuBoard _menu; Barista _barista; public: Cafe(Cashier casher, Barista barista, MenuBoard menu): _cashier(casher), _barista(barista), _menu(menu) { } void receiveMenu(Guest& guest, Menu const& menu); };
coffee.cpp
#include "coffee.h" void Menu::printMenu() { std::cout << "\n[ " << menu_name << " ]"<< std::endl; std::cout << "menu id: " << menu_id << std::endl; std::cout << "price: " << price << std::endl; }; Menu::Menu() { menu_name = NULL; price = 0; menu_id = 0; }; Menu::Menu(int price_, char const* menu_name_, int menu_id_) { menu_name = menu_name_; price = price_; menu_id = menu_id_; }; MenuBoard::MenuBoard(){ menu_num = 0; }; MenuBoard::MenuBoard(char *menu_name, int price){ menu_num = 0; addMenuBoard(menu_name, price); }; void MenuBoard::printMenu(){ std::cout << "<<<<<< MENU >>>>>>" << std::endl; for (int i = 0; i < menu_num; i++) menus[i]->printMenu(); std::cout << "<<<<<<<<<>>>>>>>>>\n" << std::endl; }; void MenuBoard::addMenuBoard(char const* menu_name, int price) { Menu *new_menu = new Menu(price, menu_name, menu_num); menus[menu_num] = new_menu; menu_num++; }; Menu MenuBoard::getMenuByName(char const* menu_name_) { for (int i = 0; i < menu_num; i++){ if (!strcmp(menus[i]->getMenuName(), menu_name_)) return (*menus[i]); } return (Menu(0, menu_name_, -1)); }; Guest::Guest(int wallet_, char const* guest_name_){ guest_name = guest_name_; wallet = wallet_; } void Guest::orderCoffee(MenuBoard const& mb, Menu const& menu){ char const* menu_name = menu.getMenuName(); std::cout << "GUEST(" << guest_name << "): " << std::ends; std::cout << menu_name << "주세요." << std::endl; } int Guest::hasMoney(int price) { if (wallet > price) return 1; else return wallet - price; } void Guest::getCoffee(){ std::cout << "[ " << guest_name << "가 커피를 받았습니다.]" << std::endl; } void Guest::getOffShop(){ std::cout << "[ " << guest_name << "가 가게를 나갔습니다.]" << std::endl; } void Guest::drinkCoffee(){ std::cout << "GUEST(" << guest_name << "): " << std::ends; std::cout << "너무 맛있어요. 다음에 또 올게요." << std::endl; } int Cashier::takeAnOrder(const Menu &menu){ menu_name = menu.getMenuName(); price = menu.getPrice(); id = menu.getId(); std::cout << "CASHIER(" << _cashier_name << "): " << std::ends; if (id == -1) { std::cout << "그런 메뉴는 없습니다." << std::endl; return (1); } std::cout << menu_name << "로 하시겠어요? 가격은 " << price << "입니다." << std::endl; return (0); }; void Barista::brewCoffee(Menu const& menu) { std::cout << "BARISTA(" << _barista_name << "): " << std::ends; std::cout << "여기 " << menu.getMenuName() << "나왔습니다." << std::endl; } void Cafe::receiveMenu(Guest& guest, Menu const& menu) { char const* guest_name = guest.getGuestName(); guest.orderCoffee(_menu, menu); if (_cashier.takeAnOrder(menu)) { std::cout << "" << std::endl; return ; } int price = menu.getPrice(); int moneyStatus = guest.hasMoney(price); if (moneyStatus == 1) { std::cout << "GUEST(" << guest_name << "): " << std::ends; std::cout << "여기 " << price << "원이요." << std::endl; _barista.brewCoffee(menu); guest.getCoffee(); guest.drinkCoffee(); } else { std::cout << "[ " << moneyStatus * -1 << "원이 모자랍니다. ]" << std::endl; std::cout << "GUEST(" << guest_name << "): " << std::ends; std::cout << "돈 벌고 다시 올게요." << std::endl; } guest.getOffShop(); std::cout << "" << std::endl; }
coffee_main.cpp
#include "coffee.h" int main() { MenuBoard menu_board; Cashier sumoon("sumoon"); Cashier taehokim("taehokim"); Barista dongslee("dongslee"); Barista juepark("juepark"); menu_board.addMenuBoard("아메리카노", 5000); menu_board.addMenuBoard("라떼", 5500); menu_board.addMenuBoard("플랫화이트", 5500); menu_board.addMenuBoard("생수", 1000); Cafe cafe(sumoon, dongslee, menu_board); Cafe cafe2(taehokim, juepark, menu_board); while (1) { std::string guest_name; std::string menu_name; int wallet; std::cout << "당신의 이름은: "; std::cin >> guest_name; char* guest_name_str = const_cast<char*>(guest_name.c_str()); std::cout << "지갑에 얼마나 가지고 있습니까?: " << std::ends; std::cin >> wallet; menu_board.printMenu(); std::cout << "무엇을 주문하시겠어요?: " << std::ends; std::cin >> menu_name; char* menu_name_str = const_cast<char*>(menu_name.c_str()); Guest guest(wallet, guest_name_str); Menu ordering = menu_board.getMenuByName(menu_name_str); cafe.receiveMenu(guest, ordering); } }
'C++(cpp)' 카테고리의 다른 글
[cpp] explicit, mutable 키워드 (0) 2021.06.24 [cpp] 소멸자, 복사 생성자 (0) 2021.06.24 [cpp] 함수 오버로딩, 생성자, 디폴트 생성자 (0) 2021.06.21 [cpp]객체, 클래스, 접근 제어자 (0) 2021.06.21 [cpp] new, delete (0) 2021.06.21