C++.Бархатный путь


Класс. Объявление класса - часть 5


class C1 { C1 MyC; // Это ошибка. В классе не допускается объявления данных-членов // объявляемого класса. C1* pMyC; // А указатель на класс объявить можно. };

Для объявления таких указателей или ссылок на объекты объявляемого класса достаточно неполного предварительного объявления класса. Указатели и ссылки имеют фиксированные размеры, которые не зависят от типа представляемого объекта.

class C2; class C1 { C1* pMyC1; C2* pMyC2; }; C2* PointOnElemOfClassC2;

Назначение неполного объявления подобно прототипу функции и используется исключительно в целях предварительного информирования транслятора. Очевидно, что создание объектов на основе предварительного неполного объявления невозможно. Однако это не снижает ценности уточнённого спецификатора.

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

class C2; class C1 { C1 F1(C1 par1) {return par1;}; //Объявить данные-члены класса C1 нельзя, а функцию - можно! C1* pMyC1; C2* pMyC2; // C1 MyC; }; C2* PointOnElemOfClassC2;

Где бы ни располагалась объявляемая в классе функция-член, транслятор приступает к её разбору лишь после того, как он определяет общую структуру класса.

В соответствии с формальным определением создадим наш первый класс:

СпецификаторКласса ::= ЗаголовокКласса { [СписокЧленов] }; ::= КлючевоеСловоКласса Идентификатор { ОбъявлениеЧленаКласса

ОбъявлениеЧленаКласса }; ::= class FirstClass { СпецификаторОбъявления ОписательЧленаКласса; ОписаниеФункции; }; ::= class FirstClass { СпецификаторОбъявления ОписательЧленаКласса; int FirstClassFunction(void);}; ::= class FirstClass { long int* PointerToLongIntVal; int FirstClassFunction(void); };




- Начало -  - Назад -  - Вперед -