Перевантаження операції індексування масиву

У С++ можна перевантажувати оператор індексування масиву. Розглянемо кілька прикладів.

1. Перевантаження операції індексування масиву з цілим аргументом операції.

class MyArray {

private:

int v0,v1,v2;

public:

MyArray(int_v0,int_v1,int_v2)

{v0=_v0;

v1=_v1;

v2=_v2;}

int GetVal(unsigned i);

int operator[ ](unsigned i);

};

Main()

{MyArray pa(10,20,30);

for(int i=0,i<=2 i++);

cout<<"pa["<<i<<]="<<pa[i];

}

Int MyArray::GetVal(unsigned i)

{switch(i){

case 0:return v0;

case 1:return v1;

case 2:return v2;

default:return -1;}}

int MyArray::operator[](unsigned i)

{return GetVal(i);}

Бачимо, що у цьому ілюстративному прикладі перевантажується операція індексування масиву так, що її результатом є значення полів v0, v1, v2 чи -1 залежно від значення цілого аргументу операції. Після відповідного перевантаження можемо у main -функції записати

MyArray ekz(1,2,3);

cout<<ekz[1];

В ekz[1] здійснюється перевантаження операції індексування. У результаті буде надруковане значення поля v1 – число 2. Вираз ekz[1] еквівалентний ekz.GetVal(1).

У цьому прикладі індексами виступають цілі числа.

Перевантажимо оператор індексування масиву, щоб аргументом були значення типу char.

2. Перевантаження операції індексування масиву із символьним аргументом операції:

struct vidnoshennia{

char symvol;

int znach;

};

class assoc{

public:

vidnoshennia*vec;

int max;

int free;

assoc(int);

int & operator[](char);

};

Assoc::assoc(int i)

{max=i;

vec=new vidnoshennia[i];

free=0;

}

int& assoc::operator[ ](char p)

{

for(vidnoshennia*pp=vec;pp<&vec[max];pp++)

if(pp->symvol==p)return pp->znach;

vec[free].symvol=p;

return vec[free++].znach;

}

Main()

{

int i=0;

char c;

assoc mas(10);

while(cin>>c)mas[c]=i++;

for(i=0;i<10;i++)

cout<<"symv="<<mas.vec[i].symvol<<"\ znach="<<mas[mas.vec[i].symvol]<<"\n";

}

У цьому прикладі перевантажується операція індексування масиву так, що індексом може виступати символьна змінна, а результатом операції є ціле число. Це дозволяє використати в програмі конструкції вигляду mas[c] та mas[mas.vec[i].symvol]. Таким способом ми будуємо відображення множини символів на множину цілих чисел. Причому операція перевантажується так, що повертається посилання на відповідне числове поле структури. Такий прийом дозволяє використовувати перевантажену операцію індексування одночасно й для ініціалізації числового поля у випадку, коли елемента з відповідним символьним індексом у масиві структур vec немає.

Із прикладу ми бачимо, що індекси перевантажених масивів можуть бути довільними типами даних. У цьому й полягає поняття асоціативного масиву, тобто за рахунок перевантаженої операції індексування масиву встановлюється взаємно однозначна відповідність між множиною індексів масиву, які можуть бути даними будь-якого типу, і відповідними значеннями.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: