미누에요
[C++] 윤성우의 열혈 C++ 11-2 C++ 기반의 데이터 입출력 문제풀이 본문
728x90
반응형
SMALL
문제 1
예제 StablePointPtrArray.cpp의 65, 66행을 다음과 같이 구성할 수 있도록 Point 클래스를 대상으로 연산자 오버로딩을 진행해보자
for (int i = 0; i < arr.GetArrlen(); i++)
cout << arr[i];
물론, 실행결과에는 변함이 없도록 연산자를 오버로딩 해야한다.
정답
#include <iostream>
#include <cstdlib>
using namespace std;
class Point
{
private:
int xpos, ypos;
public:
Point(int x = 0, int y = 0) : xpos(x), ypos(y) {}
friend ostream &operator<<(ostream &os, const Point *pos);
};
ostream &operator<<(ostream &os, const Point *pos)
{
os << "[" << pos->xpos << ", " << pos->ypos << "]" << endl;
return os;
}
typedef Point *POINT_PTR;
class BoundCheckPointPtrArray
{
private:
POINT_PTR *arr;
int arrlen;
BoundCheckPointPtrArray(const BoundCheckPointPtrArray &arr) {}
BoundCheckPointPtrArray &operator=(const BoundCheckPointPtrArray &arr) {}
public:
BoundCheckPointPtrArray(int len) : arrlen(len)
{
arr = new POINT_PTR[len];
}
POINT_PTR &operator[](int idx)
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
POINT_PTR operator[](int idx) const
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
int GetArrLen() const { return arrlen; }
~BoundCheckPointPtrArray() { delete[] arr; }
};
int main(void)
{
BoundCheckPointPtrArray arr(3);
arr[0] = new Point(3, 4);
arr[1] = new Point(5, 6);
arr[2] = new Point(7, 8);
for (int i = 0; i < arr.GetArrLen(); i++)
cout << arr[i];
delete arr[0];
delete arr[1];
delete arr[2];
return 0;
}
결과
문제 2
이번에는 재미 삼아서 2차원 배열 접근에 대한 연산자 오버로딩을 진행하고자 한다. 실제로 이렇게까지 연산자를 직접 오버로딩 하는 경우는 거의 없다.
다음의 이름으로 클래스를 정의하자.
class BoundCheck2DIntArray{ . . . . }
이 클래스는 BoundCheckIntArray 클래스의 2차원 배열 버전이다.
따라서 다음과 같이 객체를 생성하면 ,
BoundCheck2DIntArray arr2d(3,4);
세로와 가로의 길이가 각각 3과 4인, int형 2차원 배열처럼 동작하는 arr2d 객체가 생성되어, 다음의 형태로 데이터를 저장 및 참조할 수 있어야 한다.
for(int n-0;n<3;n++)
for(int m=0;m<4;m++)
arr2d[n][m] = n+m;
for(int n=0;n<3;n++){
for(int m=0;m<4;m++)
cout<<arr2d[n][m]<<' ';
cout<<endl;
}
참고로 두 개의 [] 연산자를 동시에 오버로딩 하는 것은 허용되지 않기 때문에, 위의 다음 문장은 ,
arr2d[n][m];
두 번의 [] 연산자 호출을 동반하게끔 구현해야 한다.
즉, 첫 번째 [] 연산에 의해서 위의 문장은 다음과 같이 해석되어야 하며,
(arr2d.operator[](n))[m];
그리고 arr2d.operator[](n)의 연산의 반환 값을 이용해서 두 번째 [] 연산은 다음과 같이 해석되어야 한다.
((반환 값).operator[])(m);
정답
#include <iostream>
using namespace std;
class BoundCheckIntArray
{
private:
int *arr;
int arrlen;
BoundCheckIntArray(const BoundCheckIntArray &arr) {}
BoundCheckIntArray &operator=(const BoundCheckIntArray &arr) {}
public:
BoundCheckIntArray(int len) : arrlen(len)
{
arr = new int[len];
}
int &operator[](int idx)
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array Index out of bound exception!" << endl;
exit(1);
}
return arr[idx];
}
int operator[](int idx) const
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array Index out of bound exception!" << endl;
exit(1);
}
return arr[idx];
}
int GetArrLen() const
{
return arrlen;
}
~BoundCheckIntArray()
{
delete[] arr;
}
};
typedef BoundCheckIntArray *BoundCheckIntArrayPtr;
class BoundCheck2DIntArray
{
private:
BoundCheckIntArray **arr;
int arrlen;
BoundCheck2DIntArray(const BoundCheck2DIntArray &arr) {}
BoundCheck2DIntArray &operator=(const BoundCheck2DIntArray &arr) {}
public:
BoundCheck2DIntArray(int col, int row) : arrlen(col)
{
arr = new BoundCheckIntArrayPtr[col];
for (int i = 0; i < col; i++)
arr[i] = new BoundCheckIntArray(row);
}
BoundCheckIntArray &operator[](int idx)
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array Index out of bound exception!" << endl;
exit(1);
}
return *(arr[idx]);
}
~BoundCheck2DIntArray()
{
for (int i = 0; i < arrlen; i++)
delete arr[i];
delete[] arr;
}
};
int main(void)
{
BoundCheck2DIntArray arr2d(3, 4);
for (int n = 0; n < 3; n++)
for (int m = 0; m < 4; m++)
arr2d[n][m] = n + m;
for (int n = 0; n < 3; n++)
{
for (int m = 0; m < 4; m++)
cout << arr2d[n][m] << ' ';
cout << endl;
}
return 0;
}
실행 결과
728x90
반응형
LIST
'C++' 카테고리의 다른 글
[C++] malloc과 new 의 차이점 (0) | 2024.06.25 |
---|---|
[C++] 문자열을 나타내는 방식, const char*, char*, string (0) | 2024.05.25 |
[C++] 윤성우의 열혈 C++ 11-1 깊은 복사를 하는 대입 연산자의 정의 문제풀이 (1) | 2024.05.16 |
[C++] 윤성우의 열혈 C++ 10-3 입력을 위한 >> 연산자의 오버로딩 문제풀이 (0) | 2024.05.12 |
[C++] 윤성우의 열혈 C++ 10-2 단항 연산자 오버로딩 문제풀이 (0) | 2024.05.12 |