1. 문제
10. 간단한 그래픽 편집기를 콘솔 바탕으로 만들어보자. 그래픽 편집기의 기능은 "삽입", "삭제", "모두보기", "종료" 의 4가지이고, 실행 과정은 다음과 같다.
2. 결과
3. 코드
#include <iostream>
#include <string>
using namespace std;
class Shape {
Shape* next;
protected:
virtual void draw() = 0;
public:
Shape() { next = NULL; }
virtual ~Shape() { }
void paint() { draw(); }
Shape* add(Shape* p) { this->next = p; return p; }
Shape* getNext() { return next; }
void setNext(Shape *p) { this->next = p->next; }
};
class Circle : public Shape {
protected:
virtual void draw() {
cout << "Circle" << endl;
}
};
class Rect : public Shape {
protected:
virtual void draw() {
cout << "Rectangle" << endl;
}
};
class Line : public Shape {
protected:
virtual void draw() {
cout << "Line" << endl;
}
};
class UI {
public:
static int main_memu() {
int n;
cout << "삽입:1, 삭제:2, 모두보기:3, 종료:4 >> ";
cin >> n;
return n;
}
static int one_menu() {
int n;
cout << "선:1, 원:2, 사각형:3 >> ";
cin >> n;
return n;
}
static int two_menu() {
int n;
cout << "삭제하고자 하는 도형의 인덱스 >> ";
cin >> n;
return n;
}
};
class GraphicEditor {
Shape *pStart;
Shape *pLast;
int count;
public:
GraphicEditor() { pStart = NULL; count = 0; }
void create(int num) {
switch (num) {
case 1:
if (count == 0) {
pStart = new Line();
pLast = pStart;
}
else
pLast = pLast->add(new Line());
count++;
break;
case 2:
if (count == 0) {
pStart = new Circle();
pLast = pStart;
}
else
pLast = pLast->add(new Circle());
count++;
break;
case 3:
if (count == 0) {
pStart = new Rect();
pLast = pStart;
}
else
pLast = pLast->add(new Rect());
count++;
break;
}
}
void indelete(int num) {
Shape *p = pStart;
Shape *del = pStart;
if (num < count) {
for (int i = 0; i<num; i++) {
p = del;
del = del->getNext();
}
if (num == 0)
pStart = p->getNext();
else
p->setNext(del);
count--;
if (count == 1) pLast = pStart;
delete del;
}
else
cout << "인덱스를 잘못 입력하셨습니다." << endl;
}
void call() {
bool exit = true;
cout << "그래픽 에디터입니다." << endl;
while (exit) {
switch (UI::main_memu()) {
case 1:
create(UI::one_menu());
break;
case 2:
indelete(UI::two_menu());
break;
case 3: {
Shape* p = pStart;
for (int i = 0; i< count; i++) {
cout << i << ": "; p->paint();
p = p->getNext();
}
break;
}
case 4:
exit = false;
break;
}
}
}
};
int main() {
GraphicEditor* editor = new GraphicEditor;
editor->call();
delete editor;
}
4. 설명
Shape 클래스를 상속하는 Line, Circle, Rect 클래스
GrapgicEditor 클래스
UI 클래스
크게는 이 3부분으로 나누어 진다.
힌트 그림을 참고하여서 구현하였기 때문에 그림을 같이 보시면 이해하는데 도움이 될 것이다.
UI 클래스는 정적 메소드로 선언하였기 때문에 "UI::메소드 이름" 으로 호출할 수 있다.
GraphiEditor 클래스는 Shape 포인터 변수 pStart와 pLast를 멤버 변수로 가지며 리스트를 관리한다.
Shape 클래스를 상속하는 Line, Circle, Rect 클래스들은 리스트에서의 한 개의 노드(데이터 + 포인터) 라 생각하면 된다.
'명품 C++ programming' 카테고리의 다른 글
명품 C++ programming 10장 Open Challenge (0) | 2019.05.09 |
---|---|
명품 C++ programming 9장 Open Challenge (0) | 2019.05.04 |
명품 C++ programming 실습문제 9장 9번 (0) | 2019.05.04 |
명품 C++ programming 실습문제 9장 7번, 8번 (0) | 2019.05.03 |
명품 C++ programming 실습문제 9장 6번 (0) | 2019.05.03 |