| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- C++
- git
- 유니티
- c# winform
- Flutter
- c#
- gitlab
- 깃
- 도커
- Unity
- 구조체
- docker
- 포인터
- vim
- 다트 언어
- github
- c# 추상 클래스
- Data Structure
- c# 윈폼
- Python
- C언어 포인터
- jupyter
- HTML
- c언어
- Houdini
- jupyter lab
- 플러터
- Algorithm
- C# delegate
- dart 언어
Archives
- Today
- Total
nomad-programmer
[Programming/C++] 2차원 배열접근에 대한 연산자 오버로딩의 예 본문
#include <iostream>
using namespace std;
class BoundCheckIntArray;
using BoundCheckIntArrayPtr = BoundCheckIntArray*;
class BoundCheckIntArray
{
public:
explicit BoundCheckIntArray(const int len) : arrlen(len)
{
arr = new int[len];
}
~BoundCheckIntArray()
{
delete[] arr;
}
int& operator[](const int idx)
{
if (idx < 0 || idx >= arrlen)
{
throw std::out_of_range("Index is out of range");
}
return arr[idx];
}
int operator[](const int idx) const
{
if (idx < 0 || idx >= arrlen)
{
throw std::out_of_range("Index is out of range");
}
return arr[idx];
}
BoundCheckIntArray(const BoundCheckIntArray& ref) = delete;
BoundCheckIntArray& operator=(const BoundCheckIntArray& ref) = delete;
private:
int* arr;
int arrlen;
};
class BoundCheck2DIntArray
{
public:
BoundCheck2DIntArray(const BoundCheck2DIntArray& ref) = delete;
BoundCheck2DIntArray& operator=(const BoundCheck2DIntArray& ref) = delete;
BoundCheck2DIntArray(const int row, const int col)
: row(row), col(col)
{
arr = new BoundCheckIntArrayPtr[row];
for (int i = 0; i < row; i++)
{
arr[i] = new BoundCheckIntArray(col);
}
}
~BoundCheck2DIntArray()
{
// delete each allocated BoundCheckIntArray, then the array of pointers
for (int i = 0; i < row; ++i)
{
delete arr[i];
}
delete[] arr;
}
// non-const overload
BoundCheckIntArray& operator[](const int idx)
{
if (idx < 0 || idx >= row)
{
throw std::out_of_range("Index is out of range");
}
return *(arr[idx]);
}
// const overload
const BoundCheckIntArray& operator[](const int idx) const
{
if (idx < 0 || idx >= row)
{
throw std::out_of_range("Index is out of range");
}
return *(arr[idx]);
}
private:
int row, col;
BoundCheckIntArrayPtr* arr;
};
int main()
{
BoundCheck2DIntArray arr2d(3, 4);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
arr2d[i][j] = i + j;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << arr2d[i][j] << ' ';
}
cout << endl;
}
return 0;
}
/* 결과
0 1 2 3
1 2 3 4
2 3 4 5
*/
두 번의 [ ] 연산자 호출을 동반하게끔 구현해야 한다. 즉, 다음과 같이 해석되어야 하며
(arr2d.operator[](i))[j];
그리고 arr2d.operator[](i) 연산의 반환 값을 이용해서 두 번째 [ ] 연산을 다음과 같이 해석되어야 한다.
((반환 값).operator[])(j);'Programming > C++' 카테고리의 다른 글
| [Programming/C++] 스마트 포인터(Smart Pointer) (0) | 2021.02.05 |
|---|---|
| [Programming/C++] new/delete 연산자 오버로딩 (0) | 2021.02.05 |
| [Programming/C++] 가상 상속(Virtual Inheritance) (0) | 2021.02.03 |
| [Programming/C++] 가상함수의 동작원리와 가상함수 테이블 (1) | 2021.02.03 |
| [Programming/C++] 가상 소멸자(Virtual Destructor) (2) | 2021.02.02 |
Comments