이번에는 인덱스 연산자 중복 정의를 살펴보기로 해요.
배열과 같은 컬렉션은 인덱스 연산을 통해 원소에 접근할 수 있게 사용자 편의를 제공하곤 합니다. 배열의 인덱스 연산의 결과는 좌항에 올 수도 있기 때문에 연산 결과는 원소 자체를 의미합니다. 만약 정수 형식의 데이터를 원소로 하는 배열 클래스를 정의하고 인덱스 연산자를 중복 정의한다면 원소 자체를 반환하게 구현해야 하므로 다음과 같이 정의합니다.
int &operator[](int index);//인덱스 연산자 중복 정의
다음은 인덱스 연산을 중복 정의하여 정수 형식의 데이터를 보관하는 DCArr 클래스를 정의하고 이를 사용한 예제 코드입니다.
//DCArray #pragma once class DCArray { int *base; int bcapacity; int usage; public: DCArray(int usage=0,int data=0); DCArray(const DCArray &src);//복사 생성자 ~DCArray();//소멸자 void Copy(const DCArray &src);//src 개체를 복사 DCArray &operator=(const DCArray &src);//= 연산자 중복 정의 int &operator[](int index);//인덱스 연산자 중복 정의 bool IsAvailIndex(int index)const; private: void Init(); };
//DCArray.h #include "DCArray.h" DCArray::DCArray(int usage,int data) { Init(); if(usage) { base = new int[usage]; //bcapacity개수의 int 형식을 동적으로 생성 bcapacity = usage; } for( ;this->usage<usage; this->usage++) //data를 usage만큼 보관 { base[this->usage] = data; } } DCArray::DCArray(const DCArray &src) { Init(); Copy(src); } DCArray::~DCArray() { if(base) { delete[] base; } } void DCArray::Copy(const DCArray &src)//src 개체를 복사 { bcapacity = src.bcapacity; if(base) { delete[] base; } base = new int[bcapacity]; usage = src.usage; for(int i = 0; i<usage;i++) { base[i] = src.base[i]; } } DCArray &DCArray::operator=(const DCArray &src)//= 연산자 중복 정의 { Copy(src); return (*this); } int &DCArray::operator[](int index) { if(IsAvailIndex(index)) { return base[index]; } throw "유효하지 않은 인덱스를 사용하!!!"; } bool DCArray::IsAvailIndex(int index)const { return (index>=0)&&(index<usage); } void DCArray::Init() { base = 0; bcapacity = usage = 0; }
//인덱스 연산자 중복 정의 //Program.cpp #include "DCArray.h" #include <iostream> using namespace std; int main() { DCArray dcarr(10);//저장소의 크기가 10인 동적 배열 선언 dcarr[3] = 10; dcarr[9] = 9; for(int i = 0; i<10;i++) { cout<<dcarr[i]<<" "; } cout<<endl; return 0; }