언어 자료구조 알고리즘/디딤돌 C++

[C++] 50. 인덱스 연산자 중복 정의

언제나휴일 2016. 4. 25. 01:22
반응형


인덱스 연산자 중복 정의

이번에는 인덱스 연산자 중복 정의를 살펴보기로 해요.

 

배열과 같은 컬렉션은 인덱스 연산을 통해 원소에 접근할 수 있게 사용자 편의를 제공하곤 합니다. 배열의 인덱스 연산의 결과는 좌항에 올 수도 있기 때문에 연산 결과는 원소 자체를 의미합니다.

 

만약 정수 형식의 데이터를 원소로 하는 배열 클래스를 정의하고 인덱스 연산자를 중복 정의한다면 원소 자체를 반환하게 구현해야 하므로 다음과 같이 정의합니다.

int &operator[](int index);//인덱스 연산자 중복 정의

 

다음은 인덱스 연산을 중복 정의하여 정수 형식의 데이터를 보관하는 DCArr 클래스를 정의하고 이를 사용한 예제 코드입니다.


50. 인덱스 연산자 중복 정의.zip


//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;

}

반응형