Теперь можно написать класс-адаптер для указателя на метод. Напишем простой класс, в котором реализован метод, сравнивающий свой аргумент со значением поля класса (листинг 12.17).
Листинг 12.17. Класс с методом сравнения
class Constant { int value; public:
ConstantO :value(0) {}
Constant(int a): value(a) {}
bool greater(int t) // метод сравнения
{ return value > t; }
};
Метод greaterO и будем вызывать косвенно через указатель на метод, который, очевидно, имеет следующий вид:
bool (Constant::*pointer)(int);
Напомню, что параметров у метода на самом деле два: помимо явно указанного параметра типа int есть еще this — указатель на «свой» объект. Поэтому, помимо класса-адаптера, нам потребуется еще и класс-фиксатор.
ПРИМЕЧАНИЕ
Интересно, что стандарт (см. п. п. 9.3.2 в [1]) не определяет, каким образом указатель this попадает в тело нестатического метода. Однако и в системе Visual С++. NET 2003, и в системе Borland С++ Builder 6 этот указатель передается как первый аргумент метода. Поэтому фиксатор нам потребуется только один — для второго аргумента.
1 Вообще-то классов должно быть 4, так как для каждой из двух операций выбора члена класса можно выбрать либо константный, либо неконстантный метод.
Упражнения
1. В классе Array (см. упражнение 6 в главе 8) реализовать виртуальную функцию поэлементного сложения массивов. Реализовать классы-наследники Decimal и BitString, переопределив виртуальную функцию сложения.
2. В классе Pai г (см. упражнение 1 в главе 8) операцию сложения пар реализовать как виртуальную. Реализовать класс-наследник Rational, переопределив операцию сложения как (я, Ь) + (с, d) = {ad + bc> bd).
3. Создать абстрактный базовый класс Number с виртуальными методами — арифметическими операциями сложения, вычитания, умножения, деления, возведения в степень, получения остатка от деления. Создать производные классы integer (целое) и Real (действительное).
4. Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Создать производные классы: Rectangle (прямоугольник), Circle (круг), Trapezium (трапеция) со своими функциями площади и периметра.
Площадь трапеции
S = (а + Ъ) h / 2.
Площадь круга
S = R2.
|