- •Указатели на функции
- •Для вызова функции через указатель:
- •Указатели на функции-члены
- •Чтобы указатель на функцию-член указывал на метод класса SomeClass::some_member_func(int, char*), нужно выполнить следующую инструкцию:
- •22. Экземпляризация классов и функций из шаблонов. Примеры
- •Шаблоны функций и классов
- •На пример список. Список может быть для чего угодно.
- •Построение шаблонов рассмотрим на примере. Необходимо написать функцию расчёта куба для аргумента. (Cub()).
- •Шаблоны классов
- •Шаблон класса представляет собой скелет обобщённого класса. Ситаксис такой:
- •Связные списки и другие структуры
- •23. Передача в функции объектов класса. Решение проблемы вызова конструктора и деструктора при работе локальных функций. Примеры.
Названия образуются от количества связующих список указателей в каждом объекте списка.
С писок состоит из узлов, узлы представляют собой абстрактные классы. Начало — это начало обработки промежуточных узлов списка, которые отвечают за хранение данных, указатель узла - “хвост” обязательно имеет значение null (0).
// программа работы с динамическими списками при помощи классов. // однонаправленные списки, двунаправленные списки и деревья.
#include <iostream.h> #include <iomanip.h> #include <fstream.h> ofstream fout("rez.txt"); ifstream fin("rez.txt");
class Data { public: Data (); ~Data(){delete fam;} int Compare(const Data &); void Show(); private: char fam[25]; float ball; }; Data::Data() { cout<<"\n Введите фамилию и средний балл :"; cin>>fam>>ball; } void Data::Show() { cout.width(25); cout.fill(' '); cout<<fam; cout.width(10); cout.fill('-'); cout.precision(3); cout<<ball<<"\n"; fout.width(25); fout.fill(' '); fout<<fam; fout.width(10); fout.fill('-'); fout.precision(3); fout<<ball<<"\n"; //fout<<fam<<"--"<<ball<<endl; } int Data::Compare(const Data &theO) { if(strcmp(fam,theO.fam)<0)return -1; if(strcmp(fam,theO.fam)==0)return 0; if(strcmp(fam,theO.fam)>0)return 1; } class Node; class HeadNode; class TailNode; class InternalNode;
class Node {public:
Node(){} virtual ~Node(){} virtual Node* Insert(Data* theData)=0; virtual void Show()=0; private: }; class InternalNode:public Node {public: InternalNode(Data *theData, Node *next) ; ~InternalNode(){delete myNext,delete myData;} virtual Node* Insert(Data *theData); virtual void Show() {myData->Show();myNext->Show();} private: Data* myData; Node* myNext; }; InternalNode::InternalNode(Data *theData,Node*next): myData(theData),myNext(next) {} Node* InternalNode ::Insert(Data *theData) { int result=myData->Compare(*theData); switch(result) { case 0: case1:{InternalNode *dataN=new InternalNode (theData,this); return dataN;} case-1:{myNext=myNext>Insert(theData); return this;} } return this; } class TailNode:public Node { public: TailNode(){} ~TailNode() {} virtual Node* Insert(Data *theData); virtual void Show(){ } private: }; Node* TailNode::Insert(Data *theData) { InternalNode *dataN=new InternalNode (theData,this); return dataN; } class HeadNode:public Node {public: HeadNode(){myNext=new TailNode;}; ~HeadNode(){delete myNext;} virtual Node* Insert(Data *theData); virtual void HeadNode::Show(); private: Node* myNext; }; void HeadNode::Show() { cout<<" Фамилия "<<" балл "<<endl; fout<<" Фамилия "<<" балл "<<endl; myNext->Show(); } Node* HeadNode::Insert(Data *theData) { myNext=myNext>Insert(theData); return this; }
class Admin {public: Admin(); ~Admin(){delete myHead;} void Insert(Data* pData); void ShowAll(){myHead->Show();} private: HeadNode* myHead; }; Admin::Admin() { myHead=new HeadNode; } void Admin:: Insert(Data*pData) { myHead->Insert(pData); } int main() { Data* pData; int val=1; Admin ll; while(val!=0) { pData=new Data(); ll.Insert(pData); cout<<"хотите закончить ввод? Если да, то введите 0"; cin >>val; } ll.ShowAll(); cout<<"********************************\n"; fout.close(); return 0;
23. Передача в функции объектов класса. Решение проблемы вызова конструктора и деструктора при работе локальных функций. Примеры.