|
Т. Рысқұлов атындағы Қазақ экономикалық университеті Казахский экономический университет им Т. Рыскулова
|
ТЕКСЕРГЕН:
«Қолданбалы информатика»
кафедрасының оқытушысы
Кузембекова Р.А.
«____» _________2008 ж
ОРЫНДАҒАН:
«Инженерлік – экономикалық»
факультетінің «ЕТ и ПҚ»
мамандығы бойынша оқитын
3 курс, 308 топ студенті
Нұрсұлтанов Н
Досымбеков Т
Р Е Ф Е Р А Т
ТАҚЫРЫБЫ “ Динамикалық идентификация ) ”
(«Программа құру және жоғарғы деңгейдегі тілдер»
пәні бойынша)
АЛМАТЫ 2008
ЖОСПАР
- Кіріспе…………………………………………………………….….3
- Динамикалық идентификация типі…………………………………..4
- Қолданылған әдебиеттер тізімі…………………………………….9
КІРІСПЕ
Бұл рефератта қазіргі объектілі-бағытталған программалау қолдайтын С++ құралы — динамикалық идентификация типтері қарастырылады. Бұл құрал оригиналды С++ спецификациясы болған жоқ, дегенмен оны орындалу кезінің полиморфизімін күшейту мақсатында қосты. Прогамманы жасау барысында обьект типін анықтап алу үшін , typeid операторын қолданамыз.
Динамикалық идентификация типтері.
Динамикалық идентификация типтерімен біз таныс емеспіз, өйткені олар полиморфты емес тілдерде болиады. Мысалы С және Basic секілді тілдерде.
Программа орындау барысында полиморфты емес тілдерде типтер туралы ақпарат алу керек емес. Алайда С++ секілді полиморфты тілдерде, программа толығымен іске қосылмағанынша обьектінің типі компиляцияға периодына белгілі емес болады. Біз білмейтініміздей С++ ирархия класын қолданғанда және базалық кластарда виртуальды, функция мен нұсқаушылар полиморфизмін тұрғызады.
Базалық класқа нұсқаушы ретінде осы базалық класындағы обьектілердің сілтемелері .шін қолдануға болады немесе кез-келген кластар обьектілерінде әрқашан алдын-ала белгілі бола бермейді.Олардың барлығы программаның орындалу барысында, яғни динамикалық идентификация типтерін қолданған кезде.
Прогамманы жасау барысында обьект типін анықтап алу үшін , typeid операторын қолданамыз. Ол үшін программаға <typeinfo> басына қосу қажет. Кең таралған және қолданыста жүрген typeid типінің операторы:
Typeid(object)
Бұл жердегі object обьектінің мағнасы, яғни бізге керекті обьект типін алу үшін. Бұл жерде тек қана орнықты типті ғана емес, сонымен қатар кластық та типін ала аламыз.
Typeid операторы object обьектінің типін сипаттап,type-info обьектінің типінің сілтемесіне қайтарады.
type-info класында мынандай public мүшелері анықталған.
Bool operator==(const type_info &ob);
Bool operator!=(const type_info &ob);
Bool before (const type_info &ob);
Const char *name();
Жүктелінген операторлар “==”және ”!=” типтерді салыстаруға қызмет етеді. Before функциясы true мағнасын қайтарады, егер шақырылған обьект реті параметр ретінде қолданылған обьект алдында (обьект элементімен) тұрсын. Ал name()функциясы нұсқаушыны типтің атына қайтарады.Қарапайым typeid мысалын қарастырсақ.
Мысалы
# include <iostream>
# include <typeinfo>
Using namespace std;
class MyClass {
//…
};
int main()
{
int i , j;
float f;
MyClass ob;
// обьект типін алу үшін typeid операторын қолдану.
Count<<”өзгерісті тип i:”<<typeid(i).name();
Count<<end1;
Count<<” өзгерісті тип f:”<<typeid(f).name();
Count<<end1;
Count<<” өзгерісті тип ob:”<<typeid(ob).name();
Count<<”\n\n”;
If (typeid(i) ==typeid(j))
Count<<”типы переменных i и j одинаковы.\n”;
If (typeid(i) !=typeid(f))
Count<<”типы переменных i и f одинаковы.\n”;
Return 0;
Осы программаны орындау барысында мынандай қорытындыларды аламыз.
өзгерісті тип і: int
өзгерісті тип f: float
өзгерісті тип ob: class Myclass
i және j өзгеріс типтері бірдей
i және f өзгеріс типтері бірдей емес
Егер typeid операторы полиморфты базалық класта нұсқаушыға қолданылады, және автоматты түрде реалды обьекті типін қайтарады, мына адрестелген нұсқаумен базалық кластан шығарылған обьект класы немесе базалық обьект класы болса. Осыдан кейін typeid операторын адрестелген базалық класс обьект типін динамикалық анықтауға қолдануға болады. Бұл мүмкіндікті келесі программаға көрсетілген.
// Ирархиялық полиморфты кластарға typeid операторын қолдану мысалы:
#include <iostream>
#include <typeinfo>
using namespace std;
class base {
Virtual void f() {}; //base класын полиморфты жасаймыз
//…
};
class Derived1: public Base{
//…
};
int main ( )
{
Base *p, baseob;
Derived1 ob1;
Derived2 ob2;
P=&baseob;
Cout <<”переменная p указывает на обьект типа”;
Cout << typeid (*p).name ( ) << endl;
P= &ob1;
Cout <<”переменная p указывает на обьект типа”;
Cout << typeid (*p).name ( ) << endl;
P= &ob2;
Cout <<”переменная p указывает на обьект типа”;
Cout << typeid (*p).name ( ) << endl;
Return 0;
Міне осылай орындалған программаның нәтижесі көрінеді:
Переменная р указывает на обьект типа BASE
Переменная р указывает на обьект типа DERIVED1
Переменная р указывает на обьект типа DERIVED2
Егер typeid операторы полиморфты базалық класс типінде нұсқаушыға қолданылса, нақты адрестелген обьект типі бұл қорытындыларды мақұлдаса, онда пограмма жасау барысында аныталады. Кез келген жағдайды нұсқаушыға полиморфты емес иерархиялық кластарда typeid операторы мен базалық тип нұсқаушысы алынады, бұл жерде нұсқаушының нақты қай типті қөрсеткенін анықтау мүмкін емес. Сынақ ретінде f() коментариялық виртуальды функцияға ауыстырып, BASE класының қортындысын қараймыз. Осы жерде өзгерістерді еңгізгеннен кейін BASE типі р нұсқаушысын қолданатынын көруге болады.
Көбінесе typeid операторы аты өзгертілген нұсқаушыда қолданылатындықтан, осы өзгерісті өңдеуге мынандай ерекшелік құрылды. Өйткені аты өзгермеген нұсқаушы нөлдік болып қалады. Осындай жағдайда typeid мынандай ерекшелікке bed_ typeid типіне генерацияланады .
Сілтемелер нұсқаушыға тиісті полиморфты кластарда иерархия обьектілерінде жұмыс істейді. Егер typeid операторы полиморфты класс сілтемесінде қолданылса, онда ол нақты жіберілетін обьект типіне қайтарылады және ол обьект базалық емес шығарылған тип болуы мүмкін. Құралдардың сипаттамасы көбінесе сілтеме бойынша функция обьектерән жіберу барысында қолданылады.
Тағы да бір typeid операторының форматы қолданылады. Ол тип аргументінің орнына оның тип атын қолданады:
Typeid (Имя_типа)
Мысалы, келесі инструкция нақты жіберіледі:
Cout << typeid (int). name ( );
Typeid операторының осы версиясы- type_info обьект типін алуға мүмкіндік береді. Ал оны кейінерек типтердің инструкциясын салыстыруға мүмкіндік береді.
ҚОЛДАНЫЛҒАН ӘДЕБИЕТТЕР ТІЗІМІ
- Герберт Шилдт «С++ базовый курс (третье издание)» Москва-Санкт-Петербург-Киев, Вильямс,2007;
- Павловская Т.А. «С/С++ Программирование на языке высокого уровня» Питер, 2004;
- Павловская А.Т., Щупак Ю.А. «С/С++ Структурное программирование» Питер, 2007;
- Архангельский А.Я. «Язык С++ в С++Builder» М.Бином-Пресс, 2008;
- Лаптев В.В. «С++. Объектно-ориентированное программирование» Санкт-Петербург, Питер,2008.