Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм и наследование. 
V
    Опции темы
toxx
Дата 16.4.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Написал базу данных одиночного фигурного катания, сделал производный класс парного.Хочу чтобы функция my_enter() работа нужным образом... для одиночного и парного.Вродебы всё описал по книге,а почемуто не работает.Мб у меня вообще тут полиморфизмом не пахнет?Подскажите пожалуйста.
Конкретно не понятно почему не работает это:
Код

  switch(choice)
  {
      case 1:p=new chemp;break;
      case 2:p=new chemp2;break;
  }
  thearray[i]=p;
  }


Код базы:

Код

#include <iostream.h>
#include <fstream.h>
#include <conio.h>
template<class T>     
void swap(T*x,T*y)
{T tmp;tmp=*x;*x=*y;*y=tmp;}
class chemp
{ public:
  void SetFileName(char *s){strcpy(filename,s);}
  void SetFam(char *f){strcpy(itsfam,f);}
  void SetCountry(char *f){strcpy(itscountry,f);}
  void SetScore(int i,int j,int k){itsscore=i;itsscore1=j;itsscore2=k;}
  void SetCount(char* fn)
  {
  ifstream fo;   
  fo.open(fn);   
  if (!fo!=0)    
  {
   cerr<<"File not found. ";
   exit(1);
  }
  char *s;   
  int i;      
  s=new char[255]; 
  for (i = -1; !fo.eof(); i++)
    fo.getline(s,255);
  fo.close();
  count=i;
}
  virtual void my_enter()
  {
     char *fam=new char[20];
     char *country=new char[20];
     int n,score,score1,score2;
     cout<<"Vvedite kol-vo zapisei. "<<endl;
     cin>>n;
     for (int i = 0; i < n; i++)
        {
        cout<<"Vvedi familiu: "<<endl;
        cin>>fam;SetFam(fam);
        cout<<"Vvedi strany: "<<endl;
        cin>>country;SetCountry(country);
        cout<<"Vvedi kol-vo ballov: "<<endl;
        cin>>score>>score1>>score2;SetScore(score,score1,score2);
        ofstream fo; //vixodnoi failovii potok
        fo.open(filename, ios::app); //otkririe faila na zapis` v konec
        fo<<fam<<" "<<country<<" "<<score<<" "<<
        score1<<" "<<score2<<endl;
        fo.close();
        }
  }
  void my_print()
  {
        if (!fi!=0)
      {
        cerr<<"File not found. ";
        exit(1);
      }
        fi.open(filename);
        char *s=new char [256];
        while(!fi.eof())
        {
                fi.getline(s, 256);
                cout<<s<<endl;
        }
        fi.close();
  }
void mid_score()
  {
       SetCount(filename);
        if (!fi!=0)
        {
          cerr<<"File not found. ";
          exit(1);
        }
        fi.open(filename);
        int i=0;
        char *fam=new char[20];
        char *country=new char[20];
        int score,score1,score2;
        while(!fi.eof())
        {
         if (i==count) break;
         fi>>fam>>country>>score>>score1>>score2;
         cout<<fam<<" "<<
         ((float)(score+score1+score2))/3<<endl;
         i++;
        }
        fi.close();
  }
void my_final()
  {
      if (!fi!=0)
  {
   cerr<<"File not found. ";
   exit(1);
  }
    SetCount(filename);
    fi.open(filename);
    char **f,**c;
    char *buf=new char[255];
    int str=0;
    f=new char*[255];
    c=new char*[255];
    for (int i=0; i <255; i++)
    {
     f[i]=new char [count];
     c[i]=new char [count];
    }
    int *s1=new int[count];
    int *s2=new int[count];
    int *s3=new int[count];
    float *sr=new float[count];
  char *fam=new char[20];
  char *country=new char[20];
    int score,score1,score2;
   while(!fi.eof())
        {
         fi>>fam>>country>>score>>score1>>score2;
         strcpy(f[str],fam);
         strcpy(c[str],country);
         s1[str]=score1;s2[str]=score1;s3[str]=score2;
         sr[str]=((float)(score+score1+score2)/3);
         str++;
        }
   fi.close();

   float str1;
   cout<<" ISXODNAYA TABLICA "<<endl;
   for (int i=0; i <count; i++)
   cout<<c[i]<<" "<<f[i]<<" "<<s1[i]<<" "<<s2[i]<<" "<<s3[i]<<" "<<sr[i]
     <<" "<<endl;
   int i,j;
    for (i=0;i<(count-1); i++)
     for (j=i+1; j<count; j++)
      if (sr[i]<sr[j])
      {
       strcpy(buf,c[i]);
       strcpy(c[i],c[j]);
       strcpy(c[j],buf);
       strcpy(buf,f[i]);
       strcpy(f[i],f[j]);
       strcpy(f[j],buf);
       swap(s1[i],s1[j]);
       swap(s2[i],s2[j]);
       swap(s3[i],s3[j]);
       swap(sr[i],sr[j]);
      }
      cout<<" REZUL`TATI CHEMPIONATA "<<endl;
      for (int i=0; i <count; i++)
cout<<c[i]<<" "<<f[i]<<" "<<s1[i]<<" "<<s2[i]<<" "<<s3[i]<<" "<<sr[i]
<<" "<<endl;

    /*delete []c;
    delete []f;
    delete []s1;
    delete []s2;
    delete []s3;
    delete []sr;
    delete []buf;*/
}
void my_find()
{
  char *fam=new char[20];
  char *country=new char[20];
  int score,score1,score2;
  if (!fi!=0)
  {
   cerr<<"File not found. ";
   exit(1);
  }
  fi.open(filename);
  char c;
  char *s=new char[20];
  cout<<"1 - FIO"<<endl;
  cout<<"2 - Country"<<endl;
  cin>>c;
  switch(c)
  {
  case '1': cout<<"FIO: ";
   cin>>s;
   while(!fi.eof())
  {
      fi>>fam>>country>>score>>score1>>score2;
      int t=strcmp(s,fam);
      if (t==0)  cout<<fam<<" "<<country<<" "<<score<<" "
      <<score1<<" "<<score2<<endl;
  }
  break;
  case '2':
  cout<<"Country: ";
  cin>>s;
   while(!fi.eof())
  {
    fi>>fam>>country>>score>>score1>>score2;
    int t=strcmp(s,country);
    if (t==0)  cout<<fam<<" "<<country<<" "<<score<<" "
    <<score1<<" "<<score2<<endl;
  }
  break;
  }
 fi.close();
}
 protected:
  ifstream fi;
  ofstream fo;
  char filename[20];
  char itsfam[20];
  char itscountry[10];
  int  itsscore;
  int  itsscore1;
  int  itsscore2;
  int  count;
};

class chemp2:public chemp
{ public:
  void SetFam2(char *f){strcpy(itsfam2,f);}
  void  my_enter(char *fn)
  {
     char *fam=new char[20];
     char *fam2=new char[20];
     char *country=new char[20];
     int n,score,score1,score2;
     cout<<"Vvedite kol-vo zapisei. "<<endl;
     cin>>n;
     for (int i = 0; i < n; i++)
        {
        cout<<"Vvedi familiu: "<<endl;
        cin>>fam;SetFam(fam);
        cout<<"Vvedi familiu2: "<<endl;
        cin>>fam2;SetFam2(fam);
        cout<<"Vvedi strany: "<<endl;
        cin>>country;SetCountry(country);
        cout<<"Vvedi kol-vo ballov: "<<endl;
        cin>>score>>score1>>score2;SetScore(score,score1,score2);
        ofstream fo; //vixodnoi failovii potok
        fo.open(filename, ios::app); //otkririe faila na zapis` v konec
        fo<<fam<<" "<<country<<" "<<score<<" "<<
        score1<<" "<<score2<<endl;
        fo.close();
        }
  }
  void  my_final(char *fn);
  void  my_print(char* fn);
  protected:
   char itsfam2[20];
};

int main()
{
  chemp* thearray[2];
  chemp* p;
  //SetFileName("1");
  int choice,i;
  for (i = 0; i < 2; i++)
  {
  cout<<"(1) 1-epta (2) 2-epta: ";
  cin>>choice;
  switch(choice)
  {
      case 1:p=new chemp;break;
      case 2:p=new chemp2;break;
  }
  thearray[i]=p;
  }
for (i = 0; i < 2; i++)
 thearray[i]->my_enter();
//h.my_enter();
//h.my_print();
//h.mid_score();
//h.my_final();
//h.my_find();
system("pause");
return 1;
}

PM MAIL   Вверх
Anikmar
Дата 16.4.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Во-первых.
Функции внутри объявления класса лучше размещать только короткие. Потому, как бедный компилер их сделает online, а у вас они на добрую пару десятков строк. Плюс - читать такой код просто невозможно.

Во-вторых:
Сравните объявление методов my_enter в базовом и производном. У вас они разные.

В общем сначала приведите в порядок код - объявление отдельно, определения отдельно - лично я читать такое пас.  smile 
PM MAIL ICQ   Вверх
zim22
Дата 16.4.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



чтобы полиморфизм работал необходимы, чтобы сигнатуры у функций совпадали.

class chemp
Код

virtual void my_enter()


chemp2
Код

void  my_enter(char *fn)




--------------------
PM MAIL   Вверх
J0ker
Дата 16.4.2009, 20:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(toxx @  16.4.2009,  19:55 Найти цитируемый пост)
Написал базу данных одиночного фигурного катания, сделал производный класс парного.

а почему не наоборот?  smile 


--------------------
user posted image
PM MAIL   Вверх
toxx
Дата 16.4.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



zim22
Блиин точно....ну и дурак я,думал что написал одинаковые сигнатуры.Спс что подкоректировали, ато я сктока сидел седня это делал что уже не замечаю что пишу.Кст поправил и всё заработало!!Спасибо!=)
J0ker
Ну просто сначала сделал для одиночного катания, потом решил сделать парное чтобы проверить полиморфизм и наследование.

Можете еще предложить как оптимизировать код.То что нужно убрать из объявляния класса функции это я уже понял.А что еще можно сделать?
PM MAIL   Вверх
Anikmar
Дата 16.4.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(toxx @  16.4.2009,  20:28 Найти цитируемый пост)
Можете еще предложить как оптимизировать код.То что нужно убрать из объявляния класса функции это я уже понял.А что еще можно сделать? 


Сделайте сначала это - а то черт ногу сломит  smile 
PM MAIL ICQ   Вверх
toxx
Дата 16.4.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата(Anikmar @ 16.4.2009,  20:32)
Цитата(toxx @  16.4.2009,  20:28 Найти цитируемый пост)
Можете еще предложить как оптимизировать код.То что нужно убрать из объявляния класса функции это я уже понял.А что еще можно сделать? 


Сделайте сначала это - а то черт ногу сломит  smile

Хорошо)Уже занялся этим...день прошел не зря так сказать...классы пощупал.
Anikmar
Вы это имели ввиду? Сделал

Код

#include <iostream.h>
#include <fstream.h>
#include <conio.h>
template<class T>     //shablon obmena znachenii
void swap(T*x,T*y)
{T tmp;tmp=*x;*x=*y;*y=tmp;}
class chemp
{ public:
  void SetFileName(char *s){strcpy(filename,s);}
  void SetFam(char *f){strcpy(itsfam,f);}
  void SetCountry(char *f){strcpy(itscountry,f);}
  void SetScore(int i,int j,int k){itsscore=i;itsscore1=j;itsscore2=k;}
  void SetCount(char*);
  virtual void my_enter();
  void my_print();
  void mid_score();
  void my_final();
  void my_find();
 protected:
  ifstream fi;
  ofstream fo;
  char filename[20];
  char itsfam[20];
  char itscountry[10];
  int  itsscore;
  int  itsscore1;
  int  itsscore2;
  int  count;
};

class chemp2:public chemp
{ public:
  void SetFam2(char *f){strcpy(itsfam2,f);}
  void  my_enter();
  void  my_final(char *fn);
  void  my_print(char* fn);
  protected:
   char itsfam2[20];
};

void  chemp2::my_enter()
  {
     char *fam=new char[20];
     char *fam2=new char[20];
     char *country=new char[20];
     int n,score,score1,score2;
     cout<<"Vvedite kol-vo zapisei. "<<endl;
     cin>>n;
     for (int i = 0; i < n; i++)
        {
        cout<<"Vvedi familiu: "<<endl;
        cin>>fam;SetFam(fam);
        cout<<"Vvedi familiu2: "<<endl;
        cin>>fam2;SetFam2(fam);
        cout<<"Vvedi strany: "<<endl;
        cin>>country;SetCountry(country);
        cout<<"Vvedi kol-vo ballov: "<<endl;
        cin>>score>>score1>>score2;SetScore(score,score1,score2);
        ofstream fo; //vixodnoi failovii potok
        fo.open(filename, ios::app); //otkririe faila na zapis` v konec
        fo<<fam<<" "<<country<<" "<<score<<" "<<
        score1<<" "<<score2<<endl;
        fo.close();
        }
  }
void chemp::my_find()
  {
  char *fam=new char[20];
  char *country=new char[20];
  int score,score1,score2;
  if (!fi!=0){cerr<<"File not found. ";exit(1);}
  fi.open(filename);
  char c;
  char *s=new char[20];
  cout<<"1 - FIO"<<endl;
  cout<<"2 - Country"<<endl;
  cin>>c;
  switch(c)
  {
     case '1': cout<<"FIO: ";
               cin>>s;
    while(!fi.eof())
      {
       fi>>fam>>country>>score>>score1>>score2;
       int t=strcmp(s,fam);
       if (t==0)  cout<<fam<<" "<<country<<" "<<score<<" "
       <<score1<<" "<<score2<<endl;
      }
           break;
  case '2':
             cout<<"Country: ";
             cin>>s;
   while(!fi.eof())
      {
    fi>>fam>>country>>score>>score1>>score2;
    int t=strcmp(s,country);
    if (t==0)  cout<<fam<<" "<<country<<" "<<score<<" "
    <<score1<<" "<<score2<<endl;
      }
            break;
  }
 fi.close();
  }
void chemp::my_final()
  {
    if (!fi!=0){cerr<<"File not found. ";exit(1);}
    SetCount(filename);
    fi.open(filename);
    char **f,**c;
    char *buf=new char[255];
    int str=0;
    f=new char*[255];
    c=new char*[255];
    for (int i=0; i <255; i++)
    {
     f[i]=new char [count];
     c[i]=new char [count];
    }
    int *s1=new int[count];
    int *s2=new int[count];
    int *s3=new int[count];
    float *sr=new float[count];
     char *fam=new char[20];
     char *country=new char[20];
     int score,score1,score2;
   while(!fi.eof())
        {
         fi>>fam>>country>>score>>score1>>score2;
         strcpy(f[str],fam);
         strcpy(c[str],country);
         s1[str]=score1;s2[str]=score1;s3[str]=score2;
         sr[str]=((float)(score+score1+score2)/3);
         str++;
        }
   fi.close();
   float str1;
   cout<<" ISXODNAYA TABLICA "<<endl;
   for (int i=0; i <count; i++)
   cout<<c[i]<<" "<<f[i]<<" "<<s1[i]<<" "<<s2[i]<<" "<<s3[i]<<" "<<sr[i]
     <<" "<<endl;
   int i,j;
    for (i=0;i<(count-1); i++)
     for (j=i+1; j<count; j++)
      if (sr[i]<sr[j])
      {
       strcpy(buf,c[i]);
       strcpy(c[i],c[j]);
       strcpy(c[j],buf);
       strcpy(buf,f[i]);
       strcpy(f[i],f[j]);
       strcpy(f[j],buf);
       swap(s1[i],s1[j]);
       swap(s2[i],s2[j]);
       swap(s3[i],s3[j]);
       swap(sr[i],sr[j]);
      }
      cout<<" REZUL`TATI CHEMPIONATA "<<endl;
      for (int i=0; i <count; i++)
        cout<<c[i]<<" "<<f[i]<<" "<<s1[i]<<" "<<s2[i]<<" "<<s3[i]<<" "<<sr[i]
         <<" "<<endl;
  }
void chemp::mid_score()
  {
       SetCount(filename);
       if (!fi!=0){cerr<<"File not found. ";exit(1);}
       fi.open(filename);
       int i=0;
       char *fam=new char[20];
       char *country=new char[20];
       int score,score1,score2;
       while(!fi.eof())
        {
         if (i==count) break;
         fi>>fam>>country>>score>>score1>>score2;
         cout<<fam<<" "<<
         ((float)(score+score1+score2))/3<<endl;
         i++;
        }
       fi.close();
  }
void chemp::my_print()
  {
     if (!fi!=0){cerr<<"File not found. ";exit(1);}
     fi.open(filename);
     char *s=new char [256];
     while(!fi.eof())
        {
                fi.getline(s, 256);
                cout<<s<<endl;
        }
     fi.close();
  }
void chemp::my_enter()
  {
     char *fam=new char[20];
     char *country=new char[20];
     int n,score,score1,score2;
     cout<<"Vvedite kol-vo zapisei. "<<endl;
     cin>>n;
     for (int i = 0; i < n; i++)
        {
        cout<<"Vvedi familiu: "<<endl;
        cin>>fam;SetFam(fam);
        cout<<"Vvedi strany: "<<endl;
        cin>>country;SetCountry(country);
        cout<<"Vvedi kol-vo ballov: "<<endl;
        cin>>score>>score1>>score2;SetScore(score,score1,score2);
        ofstream fo; //vixodnoi failovii potok
        fo.open(filename, ios::app); //otkririe faila na zapis` v konec
        fo<<fam<<" "<<country<<" "<<score<<" "<<
        score1<<" "<<score2<<endl;
        fo.close();
        }
  }
void chemp::SetCount(char* fn)
  {
    ifstream fo;
    fo.open(fn);
    if (!fo!=0) {cerr<<"File not found. ";exit(1);}
     char *s;    //byfer dlya chteniya stroki
     int i;      //schetchik strok
     s=new char[255]; // videlenie pamyati pod byfer
     for (i = -1; !fo.eof(); i++)//poka ne konec faila chitat` zapisi
      fo.getline(s,255);
     fo.close();
   count=i;
  }
int main()
{
  chemp* thearray[2];
  chemp* p;
  //SetFileName("1");
  int choice,i;
  for (i = 0; i < 2; i++)
  {
  cout<<"(1) 1-epta (2) 2-epta: ";
  cin>>choice;
  switch(choice)
  {
      case 1:p=new chemp;break;
      case 2:p=new chemp2;break;
  }
  thearray[i]=p;
  }
for (i = 0; i < 2; i++)
 thearray[i]->my_enter();
//h.my_enter();
//h.my_print();
//h.mid_score();
//h.my_final();
//h.my_find();
system("pause");
return 1;
}


Это сообщение отредактировал(а) toxx - 16.4.2009, 20:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.