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

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

Восстановить пароль Регистрация
 
pr1me222
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
11.01.2013, 01:02     Ошибки в работе программы с классами, наследованием и т.д #1
Имеется моя первая попытка создать класс, производный из него, конструктор и всю эту радость запустить и вывести.
Но почему то возникает приличное количество ошибок, мне не понятных ( оперируя тремя источниками создавалась эта программа, по этому не которые прототипы строчек кода не переплетались с другими).
Прошу объяснить мне мои ошибки( Заранее буду весьма благодарна)
Здесь присутствует класс 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)

Заранее извиняюсь за такую объемную и чайниковую тему )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 01:02     Ошибки в работе программы с классами, наследованием и т.д
Посмотрите здесь:

C++ Утечка памяти в работе с классами
Написал задание с классами, по примеру, но в public выдает ошибки, незнаю как их переделать :) C++
C++ Ошибка в работе с классами
С++ Необъявленный идентификатор при работе с классами. (Функция сравнивает значение свойств объектов) C++
Управление динамической памятью при работе с классами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
11.01.2013, 01:12     Ошибки в работе программы с классами, наследованием и т.д #2
1 и l - разные символы
pr1me222
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
11.01.2013, 01:17  [ТС]     Ошибки в работе программы с классами, наследованием и т.д #3
блин, такая глупая ошибка, спасибо, не заметила.
но остается еще одна ошибка в двух местах

Ошибка 2 error C2512: Dancer: нет подходящего конструктора по умолчанию (строка 87
и 25)
чем она может быть вызвана?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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*)
и он содержит три параметра
а ты вызываешь без параметров
pr1me222
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;
п.с: извините за такое огромное количество вопросов.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
11.01.2013, 01:58     Ошибки в работе программы с классами, наследованием и т.д #6
Цитата Сообщение от pr1me222 Посмотреть сообщение
исправила, но появился еще один вопрос: программа запускается, однако предлагает вводить данные указанные в первом классе, а в производном от него не выводятся :
извини не понял?
давай еще раз код (исправленный)
и конкретно что нужно и что получается
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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;
}
Если опишите поставленную перед вами задачу более подробно, получите более конкретный пример.
pr1me222
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).
Надеюсь доступно объяснила.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 02:35     Ошибки в работе программы с классами, наследованием и т.д
Еще ссылки по теме:

Ошибка при работе с классами C++
Структуры. Ошибки в работе программы C++
Ошибки в коде с вложеными классами: Невозможно обратиться к private члену C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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();
Yandex
Объявления
11.01.2013, 02:35     Ошибки в работе программы с классами, наследованием и т.д
Ответ Создать тему
Опции темы

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