열혈 C++ 프로그래밍 35

OOP 단계별 프로젝트 11

[Account.h]/*본 단계에서는 다음의 예외상황에 대한 처리를 C++의 예외처리 기반으로 적용하고자 한다.1.계좌개설 이후, 예금된 금액보다 더 많은 금액의 출금을 요구하는 예외상황2.계좌개설 이후, 입출금 진행시 프로그램 사용자로부터 0보다 작은 값이 입력되는 예외상황 이 두 가지 예외상황의 처리를 위해서 예외상황 별로 각각 예외 클래스를 정의하기로 하고,프로그램 사용자에게는 잘못된 입력이 이뤄졌음을 알리고 재 입력을 요구하는 방식으로 예외상황을 처리하도록 하자 예외의 발생 및 처리의 위치를 먼저 알려드리게 되면, 그만큼 이번 단계의 프로젝트를 무의미하게 만드는 셈이 된다.따라서 이 모든 것을 여러분이 직접 결정하는 기회로 삼기 바란다.*/ #ifndef __ACCOUNT_H__#define __..

OOP 단계별 프로젝트 10

[Account.h]#ifndef __BOUND_CHECK_ARRAY_H__#define __BOUND_CHECK_ARRAY_H__ template class BoundCheckArray{private: T *arr; int arrlen; BoundCheckArray(const BoundCheckArray &arr) //복사 방지 { } BoundCheckArray &operator=(const BoundCheckArray &arr) //대입 방지 { }public: BoundCheckArray(int len = 100); T &operator[](int idx); T operator[](int idx) const; int GetArrLen() const; ~BoundCheckArray();}; temp..

열혈 C++ 프로그래밍 13-2 문제

/*만약에 Chapter 11을 공부하면서 스마트 포인터도 공부를 했다면, 이문제를 반드시 해결하고 넘어가기 바란다.자! 그럼 문제를 제시하겠다. 우리는 앞서 Chapter 11에서 다음의 형태로 스마트 포인터를 정의하였다.class SmartPtr{private: Point *posptr;public: SmartPtr(Point *ptr) :posptr(ptr) { } Point &operator*() const { return *posptr } Point *operator->() const { return posptr; } ~SmartPtr() { delete posptr; }};이 스마트 포인터를 템플릿으로 정의하여, 어떠한 클래스의 객체도 참조할 수 있는 포인터가 되게하자.그리고는 아래의 Poin..

열혈 C++ 프로그래밍 13-1 문제

[1번 문제]/*인자로 전달되는 두 변수에 저장된 값을 서로 교환하는 SwapData라는 이름의 함수를 템플릿으로 정의해보자.그리고 다음 Point 클래스를 대상으로 값의 교환이 이뤄짐을 확인할 수 있도록 main 함수를 구성해보자class Point{private: int xpos, ypos;public: Point(int x = 0, int y = 0) :xpos(x), ypos(y) { } void ShowPosition() const { cout

OOP 단계별 프로젝트 9

[Account.h]/* 우리가 정의한 Account 클래스는 생성자에서 문자열을 동적 할당하기 때문에, 소멸자 그리고 깊은 복사를 위한 복사생성자와 대입 연산자가 정의되어 있다. 그런데 이번에 적용할 String 클래스는 메모리 공간을 동적 할당하고, 깊은 복사를 진행하는 형태로 복사생성자와 대입 연산자가 정의되어 있기 때문에, 이를 이용하면 Account 클래스의 구현이 한결 간단해진다. 조금 더 자세히 설명하면, Account 클래스의 생성자 내에서의 동적 할당이 불필요해지며, 이로 인해서 직접 정의한 소멸자와 복사 생성자 그리고 대입 연산자가 모두 불필요해진다. 바로 이러한 사실을 확인하고 다음의 결론을 스스로 내리는 것이 이번 프로젝트의 핵심이라 할 수 있다. "적절한 클래스의 등장은 다른 클래..

OOP 단계별 프로젝트 8

[Account.h]/* Account 클래스는 깊은 복사를 진행하도록 복사 생성자가 정의되어 있다. 따라서 대입 연산자도 깊은 복사가 진행되도록 정의하는 것이 좋다. 그리고 AccountHandler 클래스에는 배열이 멤버로 선언되어서 객체의 저장을 주도 하는데, 이를 이번 Chapter에서 정의한 BoundCheckPointPtrArray 배열 클래스로 대체하고자 한다. 물론, 이를 위해서는 약간의 수정이 필요하며, 클래스의 이름도 적당히 변경해야할 필요가 있다. 실제 변경이 발생하는 헤더파일과 소스파일은 다음과 같다 Account.h Account.cpp-> 대입 연산자의 정의 AccountHandler.h-> BoundCheckPointPtrArray 클래스의 적용 따라서 이들 파일에 대한 버전정..

열혈 C++ 프로그래밍 11-1 문제

[1번 문제]/*Chapter 07에서는 예제 HASComposite.cpp를 통해서 다음의 두 클래스를 정의하였다(완전한 클래스의 정의는 예제 참고)class Gun{ ....} class Police{private: int handcuffs; //소유한 수갑의 수 Gun *pistol; //소유하고 있는 권총public: ....}이에 Police 클래스를 대상으로 깊은 복사가 이뤄지도록 대입 연산자와 복사 생성자를 동시에 정의하고 이의 확인을 위해 main 함수도 적절히 정의해보자*/ //HasComposite.cpp/*#include #include using namespace std; class Gun{private: int bullet; //장전된 총알의 수public: Gun(int bnum..

열혈 C++ 프로그래밍 10-2 문제

[1번 문제]/*부호 연산자로는 -는 단항 연산자이다.이 연산자는 피연산자의 부호를 반전시킨 겨로가를 반환한다.예를 들어서 다음 문장이 실행되면,int num2= -num1;num2에는 num1과 절대값은 같지만 부호가 다른 값이 저장된다.물론 num1의 값에는 영향을 미치지 않는다.이와 유사하게 Point 클래스를 대상으로 - 연산자를 오버로딩 해보자.다음의 문장이 실행되면, Point pos2= -pos1;Pos2의 멤버변수는 pos1의 멤버변수 값과 다른 부호의 값으로 초기화되도록 오버로딩해보자*/#include using namespace std; class Point{private: int xpos; int ypos;public: Point(int x = 0, int y = 0) :xpos(x)..