Форум программистов, компьютерный форум CyberForum.ru

абстрактные классы - C++

Восстановить пароль Регистрация
 
Pikopi
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 15
24.12.2013, 12:12     абстрактные классы #1
Здрасте я при написании программы столкнулся с проблемой что немогу создать указатель на объект т.к. класс абстрактный прошу помогите исправить вот задание :
Создать абстрактный класс человек, и производные от него девушка и юноша. Определить виртуальную функцию реакции человека на вновь увиденного другого человека. Для проверки определить массив указателей на абстрактный класс, которым присваиваются адреса различных объектов.
вот мои наработки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include<iomanip>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
class Chelovek
{
      public:
      char cvg[100];
      int pol;
      int rst;
      int vozr;
      char zod[100];
      char name[100];
      virtual char* meet()=0;
int typee()
{
        int m;
        m=rand()%5;
        
}
};
///////////////////////////////////////////////////////////////////////////////////////
class girl:public Chelovek
{
      public:
      int logic;
girl()
{
      int m;
      pol=0;
      m=typee();
      switch (m)
    {
           case 0:
                strcpy(cvg,"serii");
                rst=rand()%10+150;
                vozr=rand()%18+7;
                strcpy(zod,"oven");
                strcpy(name,"varya");
                logic=rand()%1;
                break;
           case 1:
                strcpy(cvg,"golyboi");
                rst=rand()%10+160;
                vozr=rand()%3+17;
                strcpy(zod,"vesi");
                strcpy(name,"elena");
                logic=rand()%1;
                break;
           case 2:
                strcpy(cvg,"karii");
                rst=rand()%165+25;
                vozr=rand()%8+15;
                strcpy(zod,"rak");
                strcpy(name,"vasilisa");
                logic=rand()%1;
                break;
           case 3:
                strcpy(cvg,"zelenii");
                rst=rand()%30+170;
                vozr=rand()%20+3;
                strcpy(zod,"scorpion");
                strcpy(name,"dawa");
                logic=rand()%1;
                break;
           case 4:
                strcpy(cvg,"sinii");
                rst=rand()%30+180;
                vozr=rand()%15+10;
                strcpy(zod,"vodolei");
                strcpy(name,"valya");
                logic=rand()%1;
                break;
    }
}
virtual char* meet(Chelovek &c){
        if(pol==c.pol)return "poceluiutsya v weky i poprevetstvuiut dryg dryga";
}
friend ostream &operator<<(ostream &output,girl &b);
};
///////////////////////////////////////////////////////////////////////////////////////
class yn :public Chelovek
{
      public:
      virtual char* meet(Chelovek &c) {
              if(pol==c.pol&&strcmp(zod,c.zod)==0)return "obratyat dryg na dryga vnimanie";       
              if(pol==c.pol)return "pozmyt dryg drygy ruki";else if(c.vozr>vozr)return "zdraste tiotya";else return "mozhno s vami poznakomitsya??";
              
      }
yn(int r,char c[],int v,char z[])
{
       strcpy(cvg,c);
       rst=r;
       vozr=v;
       strcpy(zod,z);
}
yn()
{
    int m;
    pol=1;
    m=typee();
    switch (m)
    {
           case 0:
                strcpy(cvg,"serii");
                rst=rand()%20+150;
                vozr=rand()%7+15;
                strcpy(zod,"oven");
                strcpy(name,"maksim");
                break;
           case 1:
                strcpy(cvg,"golyboi");
                rst=rand()%20+160;
                vozr=rand()%3+17;
                strcpy(zod,"vesi");
                strcpy(name,"anton");
                break;
           case 2:
                strcpy(cvg,"karii");
                rst=rand()%30+150;
                vozr=rand()%5+18;
                strcpy(zod,"rak");
                strcpy(name,"al`bert");
                break;
           case 3:
                strcpy(cvg,"zelenii");
                rst=rand()%60+150;
                vozr=rand()%3+20;
                strcpy(zod,"scorpion");
                strcpy(name,"vasya");
                break;
           case 4:
                strcpy(cvg,"sinii");
                rst=rand()%150+30;
                vozr=rand()%15+10;
                strcpy(zod,"vodolei");
                strcpy(name,"ivan");
                break;
    }
} 
friend ostream &operator<<(ostream &output,yn &b);
};
ostream &operator<<(ostream &output,girl &b)
{
     int i;
     output<<"imya: "<<b.name<<"\t"<<"glaza: "<<b.cvg<<"\t"<<"rost: "<<b.rst<<"\t"<<"vozr: "<<b.vozr<<"\t"<<"zodiac: "<<b.zod<<"\n";
     return output;
}
ostream &operator<<(ostream &output,yn &b)
{
     int i;
     output<<"imya: "<<b.name<<"\t"<<"glaza: "<<b.cvg<<"\t"<<"rost: "<<b.rst<<"\t"<<"vozr: "<<b.vozr<<"\t"<<"zodiac: "<<b.zod<<"\n";
     return output;
}
main()
{
      Chelovek *people[2];
      people[0]=new yn; // ошибка 
      people[1]=new girl;  //ошибка
      int i;
      getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 12:12     абстрактные классы
Посмотрите здесь:

C++ абстрактные классы
C++ Абстрактные классы
Абстрактные классы C++
C++ Абстрактные классы
C++ Абстрактные классы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
24.12.2013, 12:17     абстрактные классы #2
так а под что вы выделяете память?
разве надо не
C++
1
 people[0]=new Chelovek;
Pikopi
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 15
24.12.2013, 13:11  [ТС]     абстрактные классы #3
я пытаюсь сделать 1 масив в котором были и девушки и юноши и вызывая
C++
1
2
people[i]->meet(people[j])
if(people.pol==1){...}else{ ...}
будет вызываться та перегруженая функция в зависимости от поля
C++
1
people.pol
и ошибка в том что у меня неполучается создать указатель на объект абстрактного класса
korvin_
 Аватар для korvin_
1323 / 1094 / 160
Регистрация: 28.04.2012
Сообщений: 3,921
24.12.2013, 13:14     абстрактные классы #4
Цитата Сообщение от dzrkot Посмотреть сообщение
разве надо не
Нет, Chelovek --- абстрактный класс.

Цитата Сообщение от Pikopi Посмотреть сообщение
//ошибка
Какая?

Во-первых
C++
1
2
people[0] = new yn();
people[1] = new girl();
Во-вторых, кто память очищать будет?
В-третьих, массивы char лучше заменить на std::string.
Pikopi
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 15
24.12.2013, 13:23  [ТС]     абстрактные классы #5
Цитата Сообщение от korvin_ Посмотреть сообщение
Во-вторых, кто память очищать будет?
В-третьих, массивы char лучше заменить на std::string.
память я буду очищать либо с помощью деструктора либо в ручную с помощью цикла т.к. еще нереализовал из за ошибки
kurs6.cpp cannot allocate an object of type `yn' because the following virtual functions are abstract: virtual char* Chelovek::meet()
анологичная после выделения памяти под girl
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,551
24.12.2013, 13:29     абстрактные классы #6
Цитата Сообщение от Pikopi Посмотреть сообщение
ошибка в том что у меня неполучается создать указатель на объект абстрактного класса
Невозможно создать объект абстрактного класса. У Вас отсутствует реализация чисто виртуальной функции virtual char* meet()=0;
char* girl::meet(Chelovek &c) не задаёт определение char* Chelovek::meet()=0; т.к. у них разные наборы параметров.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.12.2013, 13:35     абстрактные классы #7
Цитата Сообщение от korvin_ Посмотреть сообщение
C++
1
people[0] = new yn();
или так
C++
1
people[0]=new yn;
не имеет значения

посмотрите внимательнее на ф-цию объявленную в абстрактном классе
C++
1
virtual char* meet()=0;
я так понимаю Вы ее пытались перегрузить в наследниках
C++
1
2
3
virtual char* meet(Chelovek &c){
        if(pol==c.pol)return "poceluiutsya v weky i poprevetstvuiut dryg dryga";
    }
чувствуете разницу в синтаксисе? в итоге Ваши классы yn и girl так же абстрактные поэтому не получается создать их экземпляры

Добавлено через 50 секунд

Не по теме:

а Alex5, прав

Pikopi
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 15
24.12.2013, 13:41  [ТС]     абстрактные классы #8
Цитата Сообщение от korvin_ Посмотреть сообщение
В-третьих, массивы char лучше заменить на std::string.
почему?


Цитата Сообщение от Alex5 Посмотреть сообщение
Невозможно создать объект абстрактного класса. У Вас отсутствует реализация чисто виртуальной функции virtual char* meet()=0;
char* girl::meet(Chelovek &c) не задаёт определение char* Chelovek::meet()=0; т.к. у них разные наборы параметров.
большое спасибо понял в чем ошибка

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
я так понимаю Вы ее пытались перегрузить в наследниках
да вы правы я пытался перегрузить их в наследниках чтобы в зависимости состояния переменной pol,zod,cvg прописывать реакцию человека
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.12.2013, 13:41     абстрактные классы #9
Цитата Сообщение от Pikopi Посмотреть сообщение
почему?
если Вам реально интересно почитайте про ф-ции которые компилятор генерирует самостоятельно (сразу скажу это конструкторы копирования и оператор =) и на какие грабли можно наступить
использование string сразу решает эти проблемы
Pikopi
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 15
24.12.2013, 13:44  [ТС]     абстрактные классы #10
Цитата Сообщение от aLarman Посмотреть сообщение
если Вам реально интересно почитайте про ф-ции которые компилятор генерирует самостоятельно (сразу скажу это конструкторы копирования и оператор =) и на какие грабли можно наступить
использование string сразу решает эти проблемы
спасиба попробую учесть просто про это незнал т.к. в институте нам про этот тип сказали почему то неупоминать
aLarman
24.12.2013, 13:45
  #11

Не по теме:

да в университете говорят не более 5%

korvin_
 Аватар для korvin_
1323 / 1094 / 160
Регистрация: 28.04.2012
Сообщений: 3,921
24.12.2013, 13:51     абстрактные классы #12
Кроме того в базовом классе метод meet определен как
C++
1
virtual char* meet()
без параметров, а ты переопределяешь его как с одним параметром
C++
1
virtual char* meet(Chelovek &c)

Не по теме:

забыл обновить страницу перед постом =)



Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
не имеет значения
Оу, я думал скобки обязательны.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.12.2013, 13:54     абстрактные классы #13
Цитата Сообщение от korvin_ Посмотреть сообщение
Оу, я думал скобки обязательны.
иногда обязательны
пример вот так правильно?
C++
1
2
3
4
5
6
7
8
class A
{
};
int main()
{
A FirstImpl();
A SecondImpl;// есть ли между этими двумя строчками разница?
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 13:54     абстрактные классы
Еще ссылки по теме:

C++ Абстрактные классы
C++ Абстрактные классы
Абстрактные классы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Pikopi
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 15
24.12.2013, 13:54  [ТС]     абстрактные классы #14
Всем кто обратил внимание огромное спасиба!!!!
Yandex
Объявления
24.12.2013, 13:54     абстрактные классы
Ответ Создать тему
Опции темы

Текущее время: 10:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru