Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: альтернатива функции typeid( в bc 3.1)  (Прочитано 13254 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
alliance
Постоялец

ru
Offline Offline

« : 06-09-2008 18:33 » 

Здравствуйте, в университете мы работаем bc 3.1 когда там написал данную программу она естественно не запустилась, не подскажите есть ли альтернатива функции typeid в 3.1 ?
Код:
/
#include <iostream.h>
#include <conio.h>
#include<string.h>
#include<stdlib.h>
#include<fstream.h>
#include<typeinfo.h>
enum etype {tmanager,tscientist,tlaborer};
const int LEN =32;
const int MAX=100;
class person
{
private:
char name[LEN];
long sarpl;
static int n;
static person* arrap[];
public:
static void add();
static void write();
static void read();
static void display();
virtual etype get_type();
virtual void vvod()
{
cout<<"\nwwedite imia ";
cin>>name;
cout<<"nwwedite sarabotnuyu platu ";
cin>>sarpl;
}
virtual void vivod()
{
cout<<"\nimia "<<name;
cout<<"\nsarplata "<<sarpl;
}
};
int person:: n=0;
person* person:: arrap[MAX];
class manager:public person
{
private:
char title[LEN];
double dues;
public:
void vvod()
{
person::vvod();
cout<<"wwedite dolgnost menegera ";
cin>>title;
cout<<"wwedite wsnosi w golf club ";
cin>>dues;
}
void vivod()
{
person::vivod();
cout<<"\ndolgnost "<<title;
cout<<"\nwsnosi w golf club "<<dues;
}
};
class scientist:public person
{
private:
int pubs;
public:
void vvod()
{
person::vvod();
cout<<"wwedite colichestwo publikaciy ";
cin>>pubs;
}
void vivod()
{
person::vivod();
cout<<"\ncolichestwo publicaciy "<<pubs;
}
};
class laborer:public person
{};

etype person::get_type()
{
if(typeid(*this)==typeid(manager))
return tmanager;
else if (typeid(*this)==typeid(scientist))
return tscientist;
else if(typeid(*this)==typeid(laborer))
return tlaborer;
else cout<<"\nneprawilniy tip rabotnika ";
}
void person::add()
{
char ch;
cout<<"m-menedger,s-ucheniy,l-laborant ";
cin>>ch;
switch(ch)
{
case 'm':arrap[n]=new manager;break;
case 's':arrap[n]=new scientist;break;
case 'l':arrap[n]=new laborer;break;
default:cout<<"\nneiswestniy tip ";
}
arrap[n++]->vvod();
}
void person::write()
{
int size;
cout<<"\nidet sapis";
etype type;
ofstream outfile;
outfile.open("d:\person.dat",ios::trunc|ios::binary);
if(!outfile)
cout<<"newosmogno otkrit fail ";
for(int j=0;j<n;j++)
{
type=arrap[j]->get_type();
switch(type)
{
case tmanager:size=sizeof(manager);break;
case tscientist:size=sizeof(scientist);break;
case tlaborer:size=sizeof(laborer);break;
}
outfile.write((char*)(&type),sizeof(type));
outfile.write((char*)(arrap[n]),size);
}
if(!outfile)
{
cout<<"\nsapis newosmogna ";
return;
}
}

void person::read()
{
int size;
etype type;
ifstream infile;
infile.open("d:\person.dat",ios::binary);
if(!infile)
{
cout<<"\nnewosmogno otkrit fail";
return;
}
n=0;
while(!0)
{
infile.read((char*)(&type),sizeof(type));
if(infile.eof())
break;
if(!infile)
{
cout<<"newosmogno prochitat naswanie tipa ";
return;
}
switch(type)
{
case tmanager:arrap[n]=new manager;size=sizeof(manager);break;
case tscientist:arrap[n]=new scientist; size=sizeof(scientist);break;
case tlaborer:arrap[n]=new laborer; size=sizeof(laborer);break;
default:cout<<"\nneiswestniy tip ";return;
}
infile.read((char*)(arrap[n]),size);
n++;
}
cout<<"\nidet chtenie rabotnika ";
}
void person::display()
{
etype type;
for(int j=0;j<n;j++)
{
cout<<(j+1);
sitch(arrap[n]->gettype())
{
case tmanager:cout<<" manager\n ";break;
case tscientist:cout<<" scientist\n ";break;
case tlaborer:cout<<" laborer\n ";
default:cout<<"\nneiswestniy tip ";return;
}
arrap[j]->vivod();
}
}
void main()
{
clrscr();
char ch;
while(!0)
{
cout<<"'a'-dobawit swedeniya o rabotnike\n 'w'-sapisat swedeniya o rabotnike w faiil\n'r'-prochitat is faila\n'd'-wiwesti wse swedeniya is faila\n'x'-wixod ";
switch(ch)
{
case 'a':person::add();break;
case 'd':person::display();break;
case 'w':person::write();break;
case 'r':person::read();break;
case'x':exit(0);break;
default:cout<<"\nneprawilniy wwod dannich ";
}
}
}






Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-09-2008 18:38 » 

что за извраты, не проще ли в классе определить переменную, в которой держать id ? Улыбаюсь
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #2 : 06-09-2008 18:41 » 

эммм....заучился..))) ну а все же иметтся ли такая функция ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-09-2008 18:43 » 

не знаю, я не борландист Улыбаюсь Но в любом случае - ну нафиг эту "функцию", это всё от диавола Улыбаюсь
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #4 : 06-09-2008 18:45 » 

от Страуструпа ?)))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 06-09-2008 18:49 » 

alliance, я не припомню что то в с++ такой функции
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #6 : 06-09-2008 18:58 » 

определение в директиве typeinfo.h , извеняюсь это не функция а оператор,служит для получения информации о типе неопознанного объекта
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 06-09-2008 19:04 » 

разве такое возможно ? =0
То есть тебе, скажем, подсунули 4 байта:

0x0f, 0xef, 0xe4, 0xaa

и ты, типа, скажи - нука, а что это за тип такой ? Улыбаюсь
Если только компилятор на этапе сборки знает о типе (но тогда это никакой не "неопределённый тип") или в экземпляре есть информация о типе, добавленная компилятором же, а это мусор
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #8 : 07-09-2008 07:55 » 

как я понял , предполагается ,что некий объект принадлежит к какому либо известному типу (например к какому-либо одному из порожденных базовым),но нужно узнать к какому именно , для этого и нужен оператор typeid ,извеняюсь за корявость изложения мысли, ООП занимаюсь чуть больше двух месяцев
« Последнее редактирование: 07-09-2008 07:58 от alliance » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 07-09-2008 11:18 » 

1) когда пишешь программу, ты всегда знаешь, что переменная X - типа Y. Если забыл - смотри определение переменной.
2) если нужно при помощи указателя передать адрес переменной , тип которой функция заранее не знает, нужно использовать  наследование и полиморфизм. У всей группы типов, которые собираешься передавать в функцию, должен быть один родитель

3) может, ещё что то я пропустил Улыбаюсь но 1 и 2 достаточно на многие случаи жизни
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines