ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 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

    댓글

© 2018 TISTORY. All rights reserved.