Misol uchun, quyidagi ko'rsatmalar mutlaqo joizdir.
#include
using namespace std;
class figure {
protected:
double x, y;
public:
figure(double i, double j) {
x = i;
y = j;
}
virtual double area() = 0;
};
class triangle : public figure {
public:
riangle(double i, double j) : figure(i, j) {}
double area() {
return x * 0.5 * y;
}
};
class rectangle : public figure {
public:
rectangle(double i, double j) : figure (i, j) {}
double area() { return x * y;}
};
class circle : public figure {
public:
circle(double i, double j=0) : figure(i, j) {}
double area() {return 3.14 * x * x;}
};
figure *factory()
{
switch(rand() % 3 ) {
case 0: return new circle (10.0);
case 1: return new triangle (10.1, 5.3);
case 2: return new rectangle (4.3, 5.7);
}
return 0;
}
int main()
{
shakl * p; / / asosiy sinf uchun pointer
int i;
int t=0, r=0, c=0;
// ob'ektlarni yaratish va hisoblash
for(i=0; i<10; i++) {
p = standart (); / / ob'ektni yaratish
cout << "\n Ob'ekt sinfi " << typeid(*p).name();
cout << " turiga ega. ";
// ushbu ob'ektni hisobga oling
if(typeid(*р) == typeid(triangle)) t++;
if(typeid(*p) == typeid(rectangle)) r++;
if(typeid(*p) == typeid(circle)) c++;
// shakl mayaydonini cop etamiz
cout << "Shakl maydoni = " << p->area() << endl;
}
cout << endl;
cout << " Bunday ob'ektlar yaratildi:\n";
cout << " Uchburchaklar: " << t << endl;
cout << " To’g’rito’rtburchaklar: " << r << endl;
cout << " Aylanalar: " << с << endl;
return 0;
}
Ushbu dasturni amalga oshirishning mumkin bo'lgan natijasi shunday.
Ob'ekt sinfi rectangle turiga ega. Shakl maydoni = 24.51
Ob'ekt sinfi rectangle turiga ega. Shakl maydoni = 24.51
Ob'ekt sinfi triangle turiga ega. Shakl maydoni =26.765
Ob'ekt sinfi triangle turiga ega. Shakl maydoni = 26.765
Ob'ekt sinfi rectangle turiga ega. Shakl maydoni = 24.51
Ob'ekt sinfi triangle turiga ega. Shakl maydoni =26.765
Ob'ekt sinfI circle turiga ega. Shakl maydoni = 314
Ob'ekt sinfI circle turiga ega. Shakl maydoni = 314
Ob'ekt sinfi triangle turiga ega. Shakl maydoni = 26.765
Ob'ekt sinfi rectangle turiga ega. Shakl maydoni = 24.51
Bunday ob'ektlar yaratildi:
Uchburchaklar: 4
To’g’rito’rtburchaklar: 4
Aylanalar:
Typeid operatorini shablon sinflariga qo'llash
Operator typeid shablon sinflariga ham qo'llanilishi mumkin. Ob'ekt turi, qaysi bir namuna Andoza sinf, qisman asosida aniqlanadi, ma'lumotlar ob'ekt amalga oshirishda uning umumlashtirilgan ma'lumotlar uchun ishlatiladi nima. Shunday qilib, turli xil ma'lumotlar yordamida yaratilgan bir xil shablon sinfining ikki nusxasi turli xil turlarga ega. Oddiy misolni ko'rib chiqaylik.
/ * Shablon sinflari bilan typeid operatoridan foydalanish.*/
#include
using namespace std;
template
class myclass {
T a;
public:
myclass(T i) { a = i; }
// . . .
};
int main()
{
myclass o1(10), o2(9);
myclass o3(7.2);
cout << "\n Ob`ekt o1 turi - ";
cout << typeid(o1).name() << endl;
cout << " Ob`ekt o1 turi - ";
cout << typeid(o2).name() << endl;
cout << " Ob`ekt o1 turi - ";
cout << typeid(o3).name() << endl;
cout << endl;
if(typeid(o1) == typeid(o2))
cout << " o1 va o2 ob`ektlar bir xil turga ega.\n";
if(typeid(o1) == typeid(o3)) cout << "Hato\n";
else cout << " o1 va o3 ob`ektlar turli xil.\n";
return 0;
}
Ushbu dastur bunday natijalarni ishlab chiqaradi.
o1 obyekti turi - myclass
o2 ob'ekti turi - myclass
o3 ob'ekti turi - myclass
o1 va o2 ob'ektlari bir xil turga ega.
o1 va o3 ob'ektlari turli xil.
Ko'rib turganingizdek, ikkala ob'ekt bir xil shablon sinfining namunalari bo'lsada, ularning parametrlangan ma'lumotlari mos kelmasa, ular bir turga teng deb hisoblanmaydi. Ushbu dasturda, o1 ob'ekt turi myclass < int>, va ob'ekt o3 turi myclass < — shunday qilib, ular turli xil turga eda bolgan ob1ektlardir.
Keling, typeid operatorini shablon sinflariga qo'llashning yana bir misolini ko'rib chiqaylik, ya'ni avvalgi bo'limdagi geometrik shakllarni aniqlash dasturining o'zgartirilgan versiyasi. Bu safar shakl sinfini shablonga aylantirdik.
// Shaklning shablon versiyasi-ierarxiya.
#include
#include
using namespace std;
template
class figure
{
protected:
T x, y;
public:
figure(T i, T j) {
x = i;
у = j;
}
virtual T area() = 0;
};
template
class triangle : public figure
{
public:
triangle(T i, T j) : figure(i, j) {}
T area() {
return x * 0.5 * y;
}
};
template
class rectangle : public figure
{
public:
rectangle(T i, T j) : figure(i, j) {}
T area() {
return x * y;
}
};
template
class circle : public figure
{
public:
circle(T i, T j=0) : figure(i, j) {}
T area() {
return 3.14 * x * x;
}
};
// Фабрика объектов, генерируемых из класса figure.
figure *generator()
{
switch(rand() % 3 ) {
case 0: return new circle (10.0);
case 1: return new triangle(10.1, 5.3);
case 2: return new rectangle (4.3, 5.7);
}
return 0;
}
int main()
{
figure *p;
int i;
int t=0, c=0, r=0;
// генерируем и подсчитываем объекты
for(i=0; i<10; i++) {
p = generator();
cout << "Ob`ekt tyri " << typeid(*p).name();
cout << ". ";
// учитываем объект
if(typeid(*p) == typeid(triangle)) t++;
if(typeid(*p) == typeid(rectangle)) r++;
if(typeid(*p) == typeid(circle)) c++;
cout << "Shakl maydoni " << p->area() << endl;
}
cout << endl;
cout << "Yaratilgan shakillar:\n";
cout << " Uchburchaklar: " << t << endl;
cout << " Tog’rito’rtburchaklar: " << r << endl;
cout << " Aylanalar: " << с << endl;
return 0;
}