55
Экранда түрлі геометриялық фигураларды салу үшін
арналған кластар
иерархиясы анықтайтын бағдарлама мысалын қарастырайық. Иерархия
басында төрт класты мұрагерленетін Shape абстрактты класы орналасқан:
Line, Square, Rectangle және NullShape. Функция generator( ) объектіні
туғызады және оған көрсеткішті қайтарады. Онда қандай объект
құрылатынын, және rand ( ) - кездейсоқ сандық генераторы анықтайды. main
( ) функциясында, NullShape типті объекттерден басқа, экранда түрлі
типті
туындалған объектілер қортындысы жүзеге асырылған. Объекттер кездейсоқ
туатындықтан, алдын ала, келесі қандай объект құрылатыны белгілі
болмайды. Нәтижесінде, құрылатын объектінің типін анықтау үшін типтің
динамикалық идентификациясы талап етіледі.
# include
# include
# include
class Shape
{ public : virtual void example( )=0;};
class Rectangle:public Shape
{public:void example( ){cout«″ Тікбұрыш\n″;} };
class Triangle :public Shape
{ public:void example ( ) { cout«″ \n Үшбұрыш \n ″;} };
class line : public Shape
{ public: void example( ) {cout «″\n Сызық\n″; } };
class NullShape
{ public :void example( ){ } };
// Shape класынан туындылар фабрикасы
Shape *generator ( )
{ switch (rand ( ) %4)
{ case о: return new Line ; case 1: return new Rectangle;
case 2:return new Triangle; case3:return new NullShape;
}
return Null;
} int main (void)
{ int i; Shape *p;
for (i=0;i <10;i++)
{ p=generator( ); // келесі объектіні құру
cout «typeid (*p ) name «endl
// объектіні салады, егер ол NullShape типті емес болса
if (typeid (*p )! =typeid (NullShape)) p--example( );
} return 0;
}
Typeid операторы үлгі-кластармен жұмыс істей алады. С++ тілінде
жазылған бағдарламаны орындағанда типтер түрлері орындалады: нақты
56
және нақты емес. Типтердің нақты түрленулері әрқашан программист
қалауымен орындалады және ол үшін С++ тілінде мыналар бар:
-
Си тілінен мұрагерленген типті келтіру операциясы;
-
С++ тіліне енгізілген функционалды жазба формасы;
-
const_ cast, dynamic_cast, reinterpret_cast және static_cast
операциялары.
Соңғы операциялар типтердің түрленулерінің
анағұрлым сенімді
операциялары болып табылады, және оларды барлық қажет жағдайларда
қолданған жөн.
const_cast операциясы.
Берілген операция const модификаторының
әрекеттерін нөлге айналдыру үшін қолданылады:
const int i;
int *p=const_cast
(&i); // жай көрсеткішті аламыз
Жалпы жағдайда бұл операция келесі форматқа ие болады:
const_cast (V),
Мұндағы Т типі V типі (бұл әдетегі көрсеткіш) сияқты болу керек.
Операция Т типті нәтижені қайтарады. Бұл операцияның қажеттілігі
функцияны жобалағанда const сияқты өзгермейтін параметрлерді сипаттау
міндетті емес болумен шатастырылған, бірақ мұны жасау ұсынылады. С++
ережелері консттантты көрсеткішті жай көрсеткіш орнына беруге рұқсат
етпейді. Сондықтан const_cast операциясы осы шектеуді айналып өту үшін
енгізілген. Әрине, мұндай жағдайда функция берілетін көрсеткіш сілтеме
жасайтын мәнді өзгертпеу керек.
Компиляция кезінде ( тақырып, ортаға жаз) типтердің түрленуі (static
_cаst операциясы ) static _cаst операциясы компиляторымен орындалады
және онсыз жұмыс істеуге болмайтын кезде ғана қолданылады. static_cаst
операциясын қолданудың мысалын көрсеткіштің қажет типіне void*
көрсеткішін түрлендіру деп атауға болады, бүтін типін есептеп шығу типіне
келтіру және туыс типтердің басқа да түрленуі деп те атауға болады.
Программаны орындау кезіндегі типтердің түрленуі (dynamic_cast)
dynamic_ cast операциясы әдетте полиморфты объектілер үшін және
виртуалды базалық кластардың түрленуін төмендету үшін қолданады. Бұл
кезде, операция программаны орындау кезінде типтерді идентификациялау
(Run-Time Type Information, RTTI) механизмін қолданады.
Бақылау сұрақтары:
1)
typeid операторы көмегімен орындауға болатын опрацияларды
сипаттаңыз.
2)
Қандай объекттің типін typeid операторымен анықтайды?
3)
const_cast типті түрлендіру операциясы не үшін керек?
57
4)
dynamic_ cast типіті түрлендіру операциясы не үшін керек?
5)
static _cаst және reinterpret_cаst операциялары не үшін керек?
Достарыңызбен бөлісу: