Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
1

Ошибки в работе программы с классами, наследованием и т.д

11.01.2013, 01:02. Показов 676. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется моя первая попытка создать класс, производный из него, конструктор и всю эту радость запустить и вывести.
Но почему то возникает приличное количество ошибок, мне не понятных ( оперируя тремя источниками создавалась эта программа, по этому не которые прототипы строчек кода не переплетались с другими).
Прошу объяснить мне мои ошибки( Заранее буду весьма благодарна)
Здесь присутствует класс Dancer, производный от него Dancer_l, конструктор (так называемый) и функции ввода и вывода информации.

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
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
 
 
class Dancer
    
{
public:
Dancer (char*, int*, char*)
{}
 
    char FIOpartner[128];
    int grp;
    char FIOpartnersha[128];
 
    };
 
 
 
class Dancer_l :  public Dancer
{
public:
    Dancer_1 (char*, int*)
    {}
    char vzCat;
    int colSor;
 
};
 
 
int getdata (Dancer & dnc)
{
    cout << "Vvedite FIO partnera: ";
    cin>>dnc.FIOpartner;
     if (stricmp(dnc.FIOpartner, "exit") ==0)
     {
     return 0;
     }
    cout<< "Vvedite got rojdenja partnera: ";
    cin>>dnc.grp;
    cout<< "Vvedite FIO partnershi: ";
    cin>>dnc.FIOpartnersha;
    return 1;
 
}
 
int getdata (Dancer_1 & dnc1)
{
    cout << "Vvedite vozrastnuy categoriy (yuniuru, molodej, proffesionallu: ";
    cin>>dnc1.vzCat;
    // if (stricmp(dnc.FIOpartner, "exit") ==0)
     //{
     //return 0;
     //}
    cout<< "Vvedite kolichestvo sorevnovanii v kotoruh para uchastvovala v etom gody: ";
    cin>>dnc1.colSor;
    //cout<< "Vvedite FIO partnershi: ";
    //cin>>dnc.FIOpartnersha;
    return 1;
}
void displaydata (Dancer & dnc)
{
    cout << dnc.FIOpartner
        <<" "
        <<dnc.grp
        <<"/"
        <<dnc.FIOpartnersha;
        //<</n;
 
}
 
void displaydata (Dancer_1 & dnc1)
{
    cout << dnc1.vzCat;
        <<" "
        <<dnc1.colSor;
    
        //<<dnc.FIOpartnersha;
        //<</n;
}
 
int main (int nArg, char* pszArgs[])
{
    const int MAX = 3;
    Dancer dnc [MAX];
    cout << "Vvedite exit  dlja vuhoda v pole FIO partnera"<<endl;
    int index = 0;
    while (getdata(dnc[index]) && index <MAX)
    {
        index++;
    }
    //cout << dnc.FIOpartner<<dnc.grp<<dnc.FIOpartnersha;
    for (int i=0; i<index; i++)
    {
        displaydata(dnc[i]);
 
    }
    return 0;
}
Список выдаваемых ошибок:

Ошибка1 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию (строка 26)

Предупреждение 2 warning C4183: Dancer_1: отсутствие возвращаемого типа; предполагается функция-член, возвращающая "int" (строка 26)

Ошибка3 error C2065: Dancer_1: необъявленный идентификатор (строка49)

Ошибка4 error C2065: dnc1: необъявленный идентификатор (строка49)

Ошибка5 error C2448: getdata: вероятно, инициализатор, использующий стиль функции, является определением функции (строка50)

Ошибка 6 error C2065: Dancer_1: необъявленный идентификатор (строка74)

Ошибка7 error C2065: dnc1: необъявленный идентификатор (строка 74)

Ошибка8 error C2448: displaydata: вероятно, инициализатор, использующий стиль функции, является определением функции (строка 75)

Ошибка 9 error C2512: Dancer: нет подходящего конструктора по умолчанию (строка 87)

Заранее извиняюсь за такую объемную и чайниковую тему )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2013, 01:02
Ответы с готовыми решениями:

Ошибки при работе с классами
Создать объекты класса &lt;имя класса&gt; (класс и его поля задаются в соответствии с выбранным вариантом...

Ошибки при работе с классами на linux
Здравствуйте, нужна помощь по классам в си++. Я не так давно пишу на си++, поэтому не ругайте...

Номер строки ошибки при работе с классами
Есть обработчик ошибок, который пишет необходимую инфу о произошедшей ошибки при работе...

Работа с классами, наследованием и перегрузкой
Напишите программу с классом для реализации векторов в двумерном пространстве. У класса два поля...

8
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
11.01.2013, 01:12 2
1 и l - разные символы
0
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
11.01.2013, 01:17  [ТС] 3
блин, такая глупая ошибка, спасибо, не заметила.
но остается еще одна ошибка в двух местах

Ошибка 2 error C2512: Dancer: нет подходящего конструктора по умолчанию (строка 87
и 25)
чем она может быть вызвана?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
11.01.2013, 01:20 4
Цитата Сообщение от pr1me222 Посмотреть сообщение
Dancer (char*, int*, char*)
{}
а зачем ты создал конструктор с параметрами если ничего не инициализируешь?
тебе в конструкторе надо инициализировать члены класса
например
C++
1
2
3
4
5
6
Dancer (char* arg1, int arg2, char* arg3)
{
strcpy(FIOpartner,arg1);
grp=arg2;
strcpy(FIOpartnersha,arg3);
}
}

Добавлено через 2 минуты
Цитата Сообщение от pr1me222 Посмотреть сообщение
const int MAX = 3;
* * Dancer dnc [MAX];

у тебя только один конструктор
Цитата Сообщение от pr1me222 Посмотреть сообщение
Dancer (char*, int*, char*)
и он содержит три параметра
а ты вызываешь без параметров
0
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
11.01.2013, 01:33  [ТС] 5
исправила, но появился еще один вопрос: программа запускается, однако предлагает вводить данные указанные в первом классе, а в производном от него не выводятся :

C++
1
2
3
4
cout << "Vvedite vozrastnuy categoriy (yuniuru, molodej, proffesionallu: ";
    cin>>dnc1.vzCat;
    cout<< "Vvedite kolichestvo sorevnovanii v kotoruh para uchastvovala v etom gody: ";
    cin>>dnc1.colSor;
п.с: извините за такое огромное количество вопросов.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
11.01.2013, 01:58 6
Цитата Сообщение от pr1me222 Посмотреть сообщение
исправила, но появился еще один вопрос: программа запускается, однако предлагает вводить данные указанные в первом классе, а в производном от него не выводятся :
извини не понял?
давай еще раз код (исправленный)
и конкретно что нужно и что получается
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
11.01.2013, 02:19 7
Самая крупная беда в коде с архитектурой и декомпозицией.
Не говоря уже о неправильной работе со строками, классами и т.п.

Всегда сначала необходимо выделять основные сущности с минимально возможным набором характеристик. Заодно покажу, как обеспечить простейшую работу со строками.
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <iostream>
 
/**
 * Класс, описывающий одного танцора
 * у танцора есть имя, возраст в годах и пол
 */
class Dancer {
 public:
  // конструктор для создания объекта
  Dancer(const char *name, int age, bool gender)
    : name(strcpy(new char[strlen(name) + 1], name)), age(age),
    gender(gender) {}
  // поскольку в классе есть динамическое поле name (указатель)
  // понадобится переопределить конструктор копирования,
  // оператор присваивания и деструктор:
  // конструктор копирования
  Dancer(const Dancer &other) 
    : name(strcpy(new char[strlen(other.name) + 1], other.name)),
    age(other.age), gender(other.gender) {}
  // оператор присваивания
  Dancer &operator=(const Dancer &other) {
    if (&other != this) {
      delete [] name;
      name = strcpy(new char[strlen(other.name) + 1], other.name);
      age = other.age;
      gender = other.gender;
    }
    return *this;
  }
  // деструктор
  virtual ~Dancer() {
    delete [] name;
  }
  // методы для получения данных о танцоре (aka геттеры или аксессоры)
  // получение имени танцора
  const char *getName() const {
    return name;
  }
  // получение возраста танцора
  int getAge() const {
    return age;
  }
  // получение пола танцора
  bool getGender() const {
    return gender;
  }
 private:
  char *name;  // имя танцора
  int age;     // возраст танцора
  bool gender; // пол танцора (0 -- мужской, 1 -- женский)
};
 
/**
 * Класс, описывающий пару танцоров
 */
class DancingPair {
 public:
  // конструктор для создания пары танцоров используя два объекта танцоров
  DancingPair(const Dancer &firstDancer, const Dancer &secondDancer) 
    : firstDancer(firstDancer), secondDancer(secondDancer) {}
  // методы для получения данных
  // получение первого танцора
  const Dancer &getFirstDancer() const {
    return firstDancer;
  }
  // получение второго танцора
  const Dancer &getSecondDancer() const {
    return secondDancer;
  }  
 private:
  Dancer firstDancer;  // первый танцор
  Dancer secondDancer; // второй танцор
};
 
/**
 * Класс, описывающий возрастную группу танцоров
 */
class AgeGroup {
 public:
  // конструктор для создания возрастной группы с использованием
  // имени группы, минимального и максимального возрастов для группы
  AgeGroup(const char *name, int minimumAge, int maximumAge)
    : name(strcpy(new char[strlen(name) + 1], name)), minimumAge(minimumAge),
    maximumAge(maximumAge) {}
  // поскольку в классе есть динамическое поле name (указатель),
  // понадобится переопределить конструктор копирования,
  // оператор присваивания и деструктор (по аналогии с классом Dancer):
  // конструктор копирования
  AgeGroup(const AgeGroup &other) 
    : name(strcpy(new char[strlen(other.name) + 1], other.name)),
    minimumAge(other.minimumAge), maximumAge(other.maximumAge) {}
  // оператор присваивания
  AgeGroup &operator=(const AgeGroup &other) {
    if (&other != this) {
      delete [] name;
      name = strcpy(new char[strlen(other.name) + 1], other.name);
      minimumAge = other.minimumAge;
      maximumAge = other.maximumAge;
    }
    return *this;
  }
  // деструктор
  virtual ~AgeGroup() {
    delete [] name;
  }
  // методы для получения данных о возрастной группе
  // получение имени танцора
  const char *getName() const {
    return name;
  }
  // получение минимального возраста
  int getMinimumAge() const {
    return minimumAge;
  }
  // получение максимального возраста
  int getMaximumAge() const {
    return maximumAge;
  }
  // проверка, входит ли танцор в возрастную группу
  bool isInGroup(const Dancer &dancer) {
    return dancer.getAge() >= getMinimumAge() &&
      dancer.getAge() < getMaximumAge();
  }
  // проверка, входит ли пара в возрастную группу
  // перегруженный метод.
  // пара входит в группу, если хотя бы один из танцоров
  // входит в группу
  bool isInGroup(const DancingPair &pair) {
    return isInGroup(pair.getFirstDancer()) ||
      isInGroup(pair.getSecondDancer());
  }
 private:
  char *name;     // название группы
  int minimumAge; // минимальный возраст для группы (включительно)
  int maximumAge; // максимальный возраст для группы (не включительно)
};
 
// для упрощения основного кода, перегруежн оператор "<<" для
// вывода объектов на экран с помощью "std::cout << Dancer;"
 
// перегруженый оператор для вывода танцора
std::ostream &operator<<(std::ostream &stream, const Dancer &dancer) {
  return stream << "Dancer{" <<
    "name='" << dancer.getName() << "'," <<
    "age=" << dancer.getAge() << "," <<
    "gender=" << (dancer.getGender() ? "female" : "male" ) << "}";
}
 
// перегруженый оператор для вывода пары танцоров
std::ostream &operator<<(std::ostream &stream, const DancingPair &pair) {
  return stream << "DancingPair{" <<
    "firstDancer=" << pair.getFirstDancer() << "," <<
    "secondDancer=" << pair.getSecondDancer() << "}";
}
 
// перегруженый оператор для вывода возрастной группы
std::ostream &operator<<(std::ostream &stream, const AgeGroup &ageGroup) {
  return stream << "AgeGroup{" <<
    "name='" << ageGroup.getName() << "'," <<
    "minimumAge=" << ageGroup.getMinimumAge() << "," <<
    "maximumAge=" << ageGroup.getMaximumAge() << "}";
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  // создание нескольких возрастных групп
  AgeGroup ageGroups[] = {AgeGroup("Kids", 0, 14), AgeGroup("Juniors", 14, 18),
    AgeGroup("Amateurs", 18, 25)};
  // расчет количества созданых возрастных групп
  int numberOfAgeGroups = sizeof(ageGroups) / sizeof(AgeGroup);
 
  // танцевальная пара
  DancingPair pairIvanAndElena(Dancer("Ivan", 21, false),
    Dancer("Elena", 17, true));
 
  // вывод танцевальной пары на экран
  std::cout << pairIvanAndElena << std::endl;
  // вывод всех возрастных групп, в которых состоит пара, на экран
  for (int i = 0; i < numberOfAgeGroups; ++i) {
    // если пара состоит в группе
    if (ageGroups[i].isInGroup(pairIvanAndElena)) {
      // вывести группу на экран
      std::cout << ageGroups[i] << std::endl;
    }
  }
 
  std::cin.peek();
  return 0;
}
Если опишите поставленную перед вами задачу более подробно, получите более конкретный пример.
0
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
11.01.2013, 02:22  [ТС] 8
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
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
 
 
class Dancer
    
{
public:
//Dancer (char*, int*, char*)
//{}
 
    char FIOpartner[128];
    int grp;
    char FIOpartnersha[128];
 
    };
 
 
 
class Dancer_1 :  public Dancer
{
public:
    Dancer_1 (char*, int*)
    {}
    char vzCat;
    int colSor;
 
};
 
 
int getdata (Dancer & dnc)
{
    cout << "Vvedite FIO partnera: ";
    cin>>dnc.FIOpartner;
     if (stricmp(dnc.FIOpartner, "exit") ==0)
     {
     return 0;
     }
    cout<< "Vvedite got rojdenja partnera: ";
    cin>>dnc.grp;
    cout<< "Vvedite FIO partnershi: ";
    cin>>dnc.FIOpartnersha;
    return 1;
 
}
 
int getdata (Dancer_1 & dnc1)
{
    cout << "Vvedite vozrastnuy categoriy (yuniuru, molodej, proffesionallu: ";
    cin>>dnc1.vzCat;
    
    cout<< "Vvedite kolichestvo sorevnovanii v kotoruh para uchastvovala v etom gody: ";
    cin>>dnc1.colSor;
 
    return 1;
}
void displaydata (Dancer & dnc)
{
    cout << dnc.FIOpartner
        <<" "
        <<dnc.grp
        <<"/"
        <<dnc.FIOpartnersha;
        //<</n;
 
}
 
void displaydata (Dancer_1 & dnc1)
{
    cout << dnc1.vzCat;
    cout    <<" ";
        cout <<dnc1.colSor;
    
        //<<dnc.FIOpartnersha;
        //<</n;
}
 
int main (int nArg, char* pszArgs[])
{
    const int MAX = 3;
    Dancer dnc [MAX];
    cout << "Vvedite exit  dlja vuhoda v pole FIO partnera"<<endl;
    int index = 0;
    while (getdata(dnc[index]) && index <MAX)
    {
        index++;
    }
    //cout << dnc.FIOpartner<<dnc.grp<<dnc.FIOpartnersha;
    for (int i=0; i<index; i++)
    {
        displaydata(dnc[i]);
 
    }
    return 0;
}
Он выводит запрос о вводе информации основного класса :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int getdata (Dancer & dnc)
{
    cout << "Vvedite FIO partnera: ";
    cin>>dnc.FIOpartner;
     if (stricmp(dnc.FIOpartner, "exit") ==0)
     {
     return 0;
     }
    cout<< "Vvedite got rojdenja partnera: ";
    cin>>dnc.grp;
    cout<< "Vvedite FIO partnershi: ";
    cin>>dnc.FIOpartnersha;
    return 1;
 
}
существует такая же функция, только уже подкласса от Dancer, вот ее кусок, но почему она не выводит запрос о вводе "возрастной категории и количестве соревнований.."
C++
1
2
3
4
5
6
7
8
9
int getdata (Dancer_1 & dnc1)
{
    cout << "Vvedite vozrastnuy categoriy (yuniuru, molodej, proffesionallu: ";
    cin>>dnc1.vzCat;
    
    cout<< "Vvedite kolichestvo sorevnovanii v kotoruh para uchastvovala v etom gody: ";
    cin>>dnc1.colSor;
 
    return 1;
вообщем эта функция работает только у базового класса Dancer, а у его производного нет(Dancer_1).
Надеюсь доступно объяснила.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
11.01.2013, 02:35 9
Цитата Сообщение от pr1me222 Посмотреть сообщение
вообщем эта функция работает только у базового класса Dancer, а у его производного нет(Dancer_1).
а ты как объект объявляешь Dancer? или Dancer_1?
пример вызова функций

Добавлено через 2 минуты
Цитата Сообщение от pr1me222 Посмотреть сообщение
getdata (Dancer_1 & dnc1)
а вообще неплохо эту функцию в класс запихать тогда будет примерно так
C++
1
2
3
4
5
Dancer  dans;
Dancer_1 dans1;
....................
dans.getdata();
Dancer_1.getdata();
0
11.01.2013, 02:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2013, 02:35
Помогаю со студенческими работами здесь

Написать программу банкомат с наследованием и классами
Описать программу банкомат с наследованием классов. - снять (если возможно) заданную сумму с...

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

Ошибки при работе программы
Пишу программу-бота для личных нужд, собственно поэтому и зарегался на самом живом форуме. Дельфин...

Структуры. Ошибки в работе программы
Компиляция проходит успешно. После запуска происходят различные ошибки. Наиболее частая- та, что на...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru