-
명품 C++ 10장 8번C++ 2018. 11. 17. 02:12
8. 문제 7을 푸는 다른 방법을 소개한다. bigger() 함수의 다음 라인에서 > 연산자 때문에
if(a>b) return a;T에 Circle과 같은 클래스 타입이 대입되면, 구체화가 실패하여 컴파일 오류가 발생한다. 이 문제를 해결하기 위해 다음과 같은 추상 클래스 Comparalbe을 제안한다.
class Comparalbe { // 추상 클래스public:virtual bool operator > (Comparalbe& op2) = 0; // 순수 가상 함수virtual bool operator < (Comparalbe& op2) = 0; // 순수 가상 함수virtual bool operator == (Comparalbe& op2) = 0; // 순수 가상 함수};Circle 클래스가 Comparalbe을 상속받아 순수 가상 함수를 모두 구현하면, 앞의 bigger() 템플릿 함수를 사용하는데 아무 문제가 없다. Circle뿐 아니라. Comparable을 상속받은 모든 클래스를 bigger()에 사용할 수 있다. Comparalbe을 상속받은 Circle 클래스를 완성하고 문제 7의 main()을 실행하여 테스트 하라.
소스코드
#include <iostream>using namespace std;class Comparalbe { // 추상 클래스public:virtual bool operator > (Comparalbe& op2) = 0; // 순수 가상 함수virtual bool operator < (Comparalbe& op2) = 0; // 순수 가상 함수virtual bool operator == (Comparalbe& op2) = 0; // 순수 가상 함수};class Circle :public Comparalbe{int radius;public:Circle(int radius = 1) { this->radius = radius; }int getRadius() { return radius; }bool operator > (Comparalbe& op2);bool operator < (Comparalbe& op2);bool operator == (Comparalbe& op2);};bool Circle::operator > (Comparalbe & op2) {Circle *op;op = (Circle*)&op2;if (this->radius > op->getRadius()) return true;else return false;}bool Circle::operator < (Comparalbe & op2) {Circle *op;op = (Circle*)&op2;if (this->radius < op->getRadius()) return true;else return false;}bool Circle::operator == (Comparalbe & op2) {Circle *op;op = (Circle*)&op2;if (this->radius > op->getRadius()) return true;else return false;}template <class T>T bigger(T a, T b) { // 두 개의 매개 변수를 비교하여 큰 값을 리턴if (a > b) return a;else return b;}int main() {int a = 20, b = 50, c;c = bigger(a, b);cout << "20과 50중 큰 값은 " << c << endl;Circle waffle(10), pizza(20), y;y = bigger(waffle, pizza);cout << "waffle과 pizza 중 큰 것의 반지름은 " << y.getRadius() << endl;}실행결과
추상 클래스를 상속 받고, 연산자 함수를 재정의 합니다. 매개변수 타입이 추상클래스이므로 다운 캐스팅을 사용해 접근합니다.
'C++' 카테고리의 다른 글
명품 C++ 10장 10번 (0) 2018.11.17 명품 C++ 10장 9번 (0) 2018.11.17 명품 C++ 10장 7번 (0) 2018.11.17 명품 C++ 10장 6번 (0) 2018.11.17 명품 C++ 10장 5번 (0) 2018.11.17