-
명품 C++ 9장 10번C++ 2018. 11. 7. 23:38
10. 간단한 그래픽 편집기를 콘솔 바탕으로 만들어보자. 그래픽 편집기의 기능은 "삽입", "삭제", "모두보기", "종료"의 4가지이고, 실행 과정은 다음과 같다.
소스코드
#include <iostream>#include <string>using namespace std;class UI { // 화면 출력 및 키 입력 함수static int n; // 무슨 기능을 할지 입력 받은 숫자public:static void start(); // 첫줄에 나오는 그래픽 에디터 입니다 출력static int menu(); // 삽입 삭제 모두보기 종료static int insert(); // 도형 삽입static int del(); // 도형 삭제};int UI::n = 0;void UI::start() {cout << "그래픽 에디터입니다." << endl;}int UI::menu() { // 메뉴 출력 및 입력cout << "삽입:1, 삭제:2, 모두보기:3, 종료:4 >> ";cin >> n;return n;}int UI::insert() { // 도형 삽입에 대한 메뉴 출력 및 입력cout << "선:1, 원:2, 사각형:3 >> ";cin >> n;return n;}int UI::del() { // 도형 삭제에 대한 메뉴 출력 및 입력cout << "삭제하고자 하는 도형의 인덱스 >> ";cin >> n;return n;}class GraphicEditor { // 파생클래스int index; // 도형의 인덱스public:GraphicEditor(int i) { index = i; }virtual void show() = 0; // 각 도형들의 출력함수를 구현하기 위해 순수 가상 함수 사용int getIndex() { return index; }void subIndex() { --index; }};class Line : public GraphicEditor {public:Line(int index) : GraphicEditor(index) {}void show() { cout << getIndex() << ": Line" << endl; }};class Circle : public GraphicEditor {public:Circle(int index) : GraphicEditor(index) {}void show() { cout << getIndex() << ": Circle" << endl; }};class Rect : public GraphicEditor {public:Rect(int index) : GraphicEditor(index) {}void show() { cout << getIndex() << ": Rectangle" << endl; }};int main() {GraphicEditor *g[100];// 총 100 개를 담을수 있는 그래픽 에디터UI::start();int index = 0;for (;;) {int m = UI::menu();if (m == 1) { // 삽입int n = UI::insert();if (n == 1) { // 라인Line* l = new Line(index); //라인 객체를 그래픽 객체 배열에 저장g[index] = l;++index;}else if (n == 2) { // 원Circle* c = new Circle(index); //원 객체를 그래픽 객체 배열에 저장g[index] = c;++index;}else if (n == 3) { // 사각형Rect* r = new Rect(index);//사각형 객체를 그래픽 객체 배열에 저장g[index] = r;++index;}else cout << "입력 에러" << endl;}else if (m == 2) { // 삭제int n = UI::del();for (int i = n; i < index - 1; ++i) { // 한칸씩 당기고g[i] = g[i + 1];g[i]->subIndex(); // 한칸씩 당긴만큼 인덱스 감소}--index; // 전체 크기 감소}else if (m == 3) { // 전체 보기for (int i = 0; i < index; ++i)g[i]->show();}else if (m == 4) break;else cout << "입력 에러 " << endl;}}실행결과
각 도형의 이름이 다르기 때문에 출력하는 함수의 기능도 다 다릅니다.
순수 가상 함수를 사용하여 show() 함수를 추상 클래스에 선언하고, 각 파생클래스에서 각각 특성에 맞게 함수를 구현합니다.
도형 객체들을 생성할때 인덱스를 그래픽 에디터 객체로 넘겨줍니다.
'C++' 카테고리의 다른 글
명품 C++ 10장 1번 (0) 2018.11.16 명품 C++ 9장 Open Challenge (2) 2018.11.07 명품 C++ 9장 9번 (0) 2018.11.07 명품 C++ 9장 7번 8번 (0) 2018.11.06 명품 C++ 9장 6번 (2) 2018.11.06