Перевантаження операції виклику функції

Перевантаження операції виклику минтаксично реалізується таким чином:

<тип>operator()(параметри)

Перевантажена операція виклику функції робить об'єкт класу схожим на функцію, яку можна викликати. При цьому допускається присутність списку параметрів, які обчислюються й перевіряються на відповідність компілятором за правилами передавання параметрів:

class FuncClass {

int x;

public:

int operator()(void);

FuncClass(int n){x=n;}};

Int FuncClass::operator()(void)

{return x;}

Main()

{FuncClass object=100;

int q=object();

cout<<q;

return 0;}

Перевантаження операції виклику функції може бути корисним у випадку, коли об’єкт має домінуючу властивість. Розглянемо приклад. Перевантажимо оператор індексування масиву, щоб індексом перевантаженої операції був символьний рядок (див. другу програму в підрозд. 7.12.3). Використаємо перевантажену операцію kbit для ініціалізації полів масиву структур vec (див. програмну реалізацію нижче). Водночас у класі associ опишемо дружній клас iterator, у якому перевантажимо операцію виклику функції, щоб вона забезпечувала послідовний доступ до елементів масиву vec типу vidnosh.

# include <string.h>

# include <iostream.h>

struct vidnosh {

char*name;

int val;

};

class associ {

friend class iterator;

public:

vidnosh*vec;

int max;

int free;

associ(int);

int& operator[ ](char*);

};

Associ::associ(int_max)

{max=_max;

vec=new vidnosh[max];

free=0;

}

int& associ::operator[](char*_s)

{

vec[free].name=new char[256];

strcpy(vec[free].name,_s);

vec[free].val=free;

return free;

}

class iterator {

associ*cs;

int i;

public:

iterator(associ& s){cs=&s;i=0;}

vidnosh*operator()(void)

{

return(i<cs->free)?&cs->vec[i++]:NULL;

}

};

Main()

{

vidnosh*p=new vidnosh;

const Max=256;

char buf[Max];

associ mas(512);

while(cin>>buf)mas[buf]++;

iterator next(mas);

while(p=next())cout<<p->name<<" "<<\

p->val<<"\n";

}

У наведеному прикладі клас iterator містить перевантажений оператор виклику функції, що повертає наступний елемент динамічного масиву vec, елементами якого є структури типу vidnosh. Цей масив (у прикладі – 512 елементів) утворюється при визначенні екземпляра mas класу assoc та ініціалізується в циклі while (cin<<buf) mas[buf]++;. Тіло циклу виконується доти, доки не зустрінеться символ кінця файла. В останньому операторі while просто друкується вміст масиву: символьний рядок і кількість його входжень у вхідному потоці.


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



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