C++

[C++]명품 C++ 프로그래밍 실습문제 10장 16번

Hs’s Coding vlog 2023. 1. 25. 21:45

[C++]명품 C++ 프로그래밍 실습문제 10장 16번

[C++]명품 C++ programming 실습문제 10장 16번

명품 C++ 프로그래밍실습문제/연습문제 /C++

//Circle.cpp

#include "Circle.h"

void Circle:: draw() {
	cout << "Circle" << endl;
}

//Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
#include <iostream>
#include "Shape.h"
using namespace std;

class Circle : public Shape {
protected:
	virtual void draw();

};
#endif
//Line.cpp
#include "Line.h"

void Line::draw() {
	cout << "Line" << endl;
}


//Line.h
#ifndef LINE_H
#define LINE_H
#include <iostream>
#include "Shape.h"
using namespace std;

class Line : public Shape {
protected:
	virtual void draw();

};

#endif
//main.cpp
#include <iostream>
#include <string>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Line.h"
#include <vector>
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 {
    vector<Shape*> v;
    vector<Shape*>::iterator it;
public:
    GraphicEditor() {}
    void insert() {
        int n = UI::insert();
        if (n == 1) // 라인
            v.push_back(new Line());
        else if (n == 2)  // 원
            v.push_back(new Circle());
        else if (n == 3) // 사각형
            v.push_back(new Rectangle());
        else cout << "입력 에러" << endl;
    }
    void deleteShape() {
        int n = UI::del();
        Shape* del;
        it = v.begin();
        for (int i = 0; i < n; ++i)
            ++it;
        del = *it;
        it = v.erase(it);
        delete del;
    }
    void showAll() {
        for (int i = 0; i < v.size(); ++i) {
            cout << i << ": ";
            v[i]->paint();
        }
    }
    void start() {
        UI::start();
        for (;;) {
            int m = UI::menu();
            if (m == 1) // 삽입
                insert();
            else if (m == 2) // 삭제
                deleteShape();
            else if (m == 3)  // 전체 보기
                showAll();
            else if (m == 4) break;
            else cout << "입력 에러 " << endl;
        }
    }
};
int main() {
    GraphicEditor* g=new GraphicEditor;
    g->start();
    delete g;
}

//Rectangle.cpp
#include "Rectangle.h"


void Rectangle::draw() {
		cout << "Rectangle" << endl;
}

//Rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include <iostream>
#include "Shape.h"
using namespace std;

class Rectangle : public Shape {
protected:
	virtual void draw();

};

#endif

//Shape.cpp
#include <iostream>
#include "Shape.h"
Shape::Shape() { next = NULL; }
Shape* Shape::add(Shape* p) {
	this->next = p;
	return p;
}
void Shape::paint() {
	draw();
}
Shape* Shape::getNext() { return next; }

//Shape.h
#ifndef SHAPE_H
#define SHAPE_H
#include <iostream>
using namespace std;
class Shape {
	Shape* next;
protected:
	virtual void draw() = 0;
public:
	Shape();
	virtual ~Shape() {}
	Shape* add(Shape* p);
	void paint();
	Shape* getNext();
};

#endif