Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 14-1 : Chapter 13 내용의 확장 본문

Programming Lang/C++

C++ Chapter 14-1 : Chapter 13 내용의 확장

시데브 2023. 7. 31. 16:01

Point 클래스 템플릿과 배열 클래스 템플릿

 Point<int> 템플릿 클래스의 객체를 저장하는 객체는 다음 방법으로 생성할 수 있다.

BoundCheckArray<int> iarr(50);	//int형 데이터 저장
BoundCheckArray<Point<int>> oarr(50);	//Point<int> 템플릿 클래스의 객체 저장
BoundCheckArray<Point<int>*> oparr(50);	//Point<int>형 포인터 저장

typedef Point<int>* POINT_PTR;
BoundCheckArray<POINT_PTR> oparr(50);	//Point<int>형 포인터 저장

 그렇다면 이를 이용해 지난 chapter 13의 예제를 확장해보자.

 

 파일명 : PointTemplate.h

#ifndef __POINT_TEMPLATE_H_
#define __POINT_TEMPLATE_H_

template <class T>
class Point
{
private:
    T xpos, ypos;
public:
    Point(T x=0, T y=0);
    void ShowPosition() const;
};

template <class T>
Point<T>::Point(T x, T y) : xpos(x), ypos(y)
{ }

template <class T>
void Point<T>::ShowPosition() const
{
    cout<<'['<<xpos<<", "<<ypos<<']'<<endl;
}

#endif

 파일명 : ArrayTemplate.h

#ifndef __ARRAY_TEM__
#define __ARRAY_TEM__

#include <iostream>
#include <cstdlib>
using namespace std;

template <class T>
class BoundCheckArray
{
private:
    T * arr;
    int arrlen;

    BoundCheckArray(const BoundCheckArray& arr) { }
    BoundCheckArray& operator=(const BoundCheckArray& arr) { }

public:
    BoundCheckArray(int len);
    T& operator[] (int idx);
    T operator[] (int idx) const;
    int GetArrayLen() const;
    ~BoundCheckArray();
};

template <class T>
BoundCheckArray<T>::BoundCheckArray(int len) : arrlen(len)
{
    arr = new T[len];
}


template <class T>
T& BoundCheckArray<T>::operator[](int idx)
{
    if (idx < 0 || idx >= arrlen)
    {
        cout << "Array index out of bound exception" << endl;
        exit(1);
    }
    return arr[idx];
}

template <class T>
T BoundCheckArray<T>::operator[](int idx) const
{
    if (idx < 0 || idx >= arrlen)
    {
        cout << "Array index out of bound exception" << endl;
        exit(1);
    }
    return arr[idx];
}

template <class T>
int BoundCheckArray<T>::GetArrayLen() const { return arrlen; }

template <class T>
BoundCheckArray<T>::~BoundCheckArray() { delete []arr; }

#endif

 파일명 : BoundArrayMain.cpp

#include <iostream>
#include "ArrayTemplate.h"
#include "PointTemplate.h"
using namespace std;

int main(void)
{
    /*** Point<int> 템플릿 클래스의 객체 저장 ***/
    BoundCheckArray<Point<int>> oarr1(3);
    oarr1[0] = Point<int>(3, 4);
    oarr1[1] = Point<int>(5, 6);
    oarr1[2] = Point<int>(7, 8);

    for(int i=0; i<oarr1.GetArrayLen(); i++)
        oarr1[i].ShowPosition();

    /*** Point<double> 템플릿 클래스의 객체 저장 ***/
    BoundCheckArray<Point<double>> oarr2(3);
    oarr2[0] = Point<double>(3.14, 4.31);
    oarr2[1] = Point<double>(5.09, 6.07);
    oarr2[2] = Point<double>(7.82, 8.54);

    for(int i=0; i<oarr2.GetArrayLen(); i++)
        oarr2[i].ShowPosition();

    /*** Point<int>형 포인터 저장 ***/
    typedef Point<int>* POINT_PTR;
    BoundCheckArray<POINT_PTR> oparr(3);
    oparr[0] = new Point<int>(11, 12);
    oparr[1] = new Point<int>(13, 14);
    oparr[2] = new Point<int>(15, 16);

    for(int i=0; i<oparr.GetArrayLen(); i++)
        oparr[i] -> ShowPosition();

    delete oparr[0];
    delete oparr[1];
    delete oparr[2];

    return 0;
}
[3, 4]
[5, 6]
[7, 8]
[3.14, 4.31]
[5.09, 6.07]
[7.82, 8.54]
[11, 12]
[13, 14]
[15, 16]

 

특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와 friend 선언

  • Point<int>, Point<double>과 같은 템플릿 클래스의 자료형을 대상으로 템플릿이 아닌 일반함수 정의가 가능
  • 클래스 템플릿 내에서 이런 함수를 대상으로 friend 선언 가능

 이와 관련된 예제를 살펴보자.

#include <iostream>
using namespace std;

template <class T>
class Point
{
private:
    T xpos, ypos;
public:
    Point(T x=0, T y=0) : xpos(x), ypos(y)
    { }
    void ShowPosition() const
    {
        cout<<'['<<xpos<<", "<<ypos<<']'<<endl;
    }
    friend Point<int> operator+(const Point<int>&, const Point<int>&);
    friend ostream& operator<<(ostream& os, const Point<int>& pos);
};

Point<int> operator+(const Point<int>& pos1, const Point<int>& pos2)
{
    return Point<int>(pos1.xpos+pos2.xpos, pos1.ypos+pos2.ypos);
}

ostream& operator<<(ostream& os, const Point<int>& pos)
{
    os<<'['<<pos.xpos<<", "<<pos.ypos<<']'<<endl;
    return os;
}

int main(void)
{
    Point<int> pos1(2, 4);
    Point<int> pos2(4, 8);
    Point<int> pos3=pos1+pos2;
    cout<<pos1<<pos2<<pos3;
    
    return 0;
}
[2, 4]
[4, 8]
[6, 12]

 

 


참고자료

  • 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12