More C++ Idioms/Algebraic Hierarchy

진영민·2022년 7월 9일
1

More C++ Idioms

목록 보기
4/10

1. 의도

하나의 generic abstraction에 여러 개의 추상화를 숨기는 것
예)

Number n1 = Complex (1, 2);
Number n2 = Real (10);
Number n3 = n1 + n2;
Number n2 = n3;

Number이라는 class안에 복소수, 실수를 만들고 그들의 덧셈 등을 포함시킬 수 있다!

2. 방법

2-1 구조

struct BaseConstructor { BaseConstructor(int=0) {} };

class RealNumber;
class Complex;
class Number;

class Number
{
	friend class RealNumber;
    friend class Complex;
public:
//=연산을 만들어 준다.
    Number & operator = (const Number &n);
    
//생성자
	Number (const Number &n);
	virtual ~Number();
	
//+연산
	virtual Number operator + (Number const &n) const;
	
//실수 만들기
	static Number makeReal (double r);
//허수 만들기
	static Number makeComplex (double rpart, double ipart);
    
protected:
	Number ();
	Number (BaseConstructor);
    
private:
//재정의
	void redefine (Number *n);
//복소수, 실수 덧셈
	virtual Number complexAdd (Complex const &n) const;
	virtual Number realAdd (RealNumber const &n) const;
	
	Number *rep;
	short referenceCount;
};

class Complex : public Number
{
	friend class RealNumber;
    friend class Number;
    
//생성자
	Complex (double d, double e);
    Complex (const Complex &c);
    virtual ~Complex ();
	
//+연산자, Complex+Real, Complex+Complex
	virtual Number operator + (Number const &n) const;
    virtual Number realAdd (RealNumber const &n) const;
    virtual Number complexAdd (Complex const &n) const;
	double rpart, ipart;
};

class RealNumber : public Number
{
	friend class Complex;
    friend class Number;
	
//실수 생성자
    RealNumber (double r);
    RealNumber (const RealNumber &r);
    virtual ~RealNumber ();
	
 /+연산자, Real+Real, Real+Complex
	virtual Number operator + (Number const &n) const;
    virtual Number realAdd (RealNumber const &n) const;
    virtual Number complexAdd (Complex const &n) const;

	double val;
};
-->각 함수 안의 내용은 간단하므로 적지 않는다.

이를 이용하여 Complex와 RealNumber class가 Number의 class를 상속한다.

profile
코린이

0개의 댓글