Опубликован: 25.08.2010 | Доступ: свободный | Студентов: 6394 / 711 | Оценка: 3.91 / 3.44 | Длительность: 11:09:00
Лекция 5:

Классы

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >

Указатели на элементы классов

К элементам классов можно обращаться с помощью указателей. Для этого определены операции .* и ->*. Указатели на поля и методы класса определяются по-разному.

Формат указателя на метод класса:

возвр_тип (имя_класса::*имя_указателя)(параметры);

Например, описание указателя на метод класса monster

int get_health() const {return health;}

будет иметь вид:

int (monster:: *pget)();

Такой указатель можно задавать в качестве параметра функции. Это дает возможность передавать в функцию имя метода:

void fun(int (monster:: *pget)())
{
(*this.*pget)();	// Вызов функции через операцию .*
(this->*pget)();	// Вызов функции через операцию ->*
}

Можно настроить указатель на конкретный метод с помощью операции взятия адреса:

pget = & monster::get_health;// Присваивание значения указателю
monster Vasia, *p;
p = new monster;
int Vasin_health = (Vasia.*pget)();//Вызов функции через операцию .*
int p_health = (p->*pget)();	// Вызов функции через операцию ->*
  • Указателю на метод можно присваивать только адреса методов, имеющих соответствующий заголовок.
  • Нельзя определять указатель на статический метод класса.
  • Нельзя преобразовывать указатель на метод в указатель на обычную функцию, не являющуюся элементом класса.

Как и указатели на обычные функции, указатели на методы используются в том случае, когда возникает необходимость вызвать метод, имя которого неизвестно. Однако в отличие указателя на переменную или обычную функцию, указатель на метод не ссылается на определенный адрес памяти. Он больше похож на индекс в массиве, поскольку задает смещение. Конкретный адрес в памяти получается путем сочетания указателя на метод с указателем на определенный объект.

ПРИМЕЧАНИЕ

Методы, вызываемые через указатели, могут быть виртуальными. При этом вызывается метод, соответствующий типу объекта, к которому применялся указатель.

Формат указателя на поле класса:

тип_данных(имя_класса::*имя_указателя);

В определение указателя можно включить его инициализацию в форме:

&имя_класса::*имя_поля;	// Поле должно быть public

Если бы поле health было объявлено как public, определение указателя на него имело бы вид:

int (monster::*phealth) = &monster::health;
cout << Vasia.*phealth;	// Обращение через операцию .*
cout << p->*phealth;	// Обращение через операцию ->*

Обратите внимание на то, что указатели на поля классов не являются обычными указателями - ведь при присваивании им значений они не ссылаются на конкретный адрес памяти, поскольку память выделяется не под классы, а под объекты классов.

Рекомендации по составу класса

Как правило, класс как тип, определенный пользователем, содержит скрытые поля и следующие функции:

  • конструкторы, определяющие, как инициализируются объекты класса;
  • набор методов доступа к скрытым элементам класса (эти методы описываются с модификатором const, указывающим, что они не должны изменять значения полей);
  • набор методов, изменяющих значения полей;
  • набор операций, позволяющих присваивать, сравнивать объекты и производить с ними другие действия, требующиеся по сути класса;
  • класс исключений, используемый для сообщений об ошибках с помощью генерации исключительных ситуаций.

Если существуют функции, которые работают с классом или несколькими классами через интерфейс (то есть доступ к скрытым полям им не требуется), можно описать их вне классов, чтобы не перегружать интерфейсы, а для обеспечения логической связи поместить их в общее с этими классами пространство имен, например:

namespace Staff{
	class monster { /* * */};
	class hero { /* * */};
	void interact(hero, monster); ... }
< Лекция 4 || Лекция 5: 1234 || Лекция 6 >
Dana Kanatkyzi
Dana Kanatkyzi
Здравствуйте.Помогите решить задачу минимум 4 чисел.Условие такое:"Напишите функцию int min (int a, int b, int c, int d) (C/C++)"находящую наименьшее из четырех данных чисел."Заранее спасибо!