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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pr1me222
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 71
#1

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

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

Имеется моя первая попытка создать класс, производный из него, конструктор и всю эту радость запустить и вывести.
Но почему то возникает приличное количество ошибок, мне не понятных ( оперируя тремя источниками создавалась эта программа, по этому не которые прототипы строчек кода не переплетались с другими).
Прошу объяснить мне мои ошибки( Заранее буду весьма благодарна)
Здесь присутствует класс 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 01:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки в работе программы с классами, наследованием и т.д (C++):

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

Исправить ошибки в работе программы нахождения координат - C++
//а) удалить все точки не из окружности радиуса 10 с центром в начале координат //б) подсчитать сумму расстояний от начала координат до...

Ошибка в работе с классами - C++
День добрый. Прошу помощи в решении такой проблеммы. Есть несколько классов и при компиляции возникает такое: Error 4 error C2784:...

Ошибка при работе с классами - C++
Выдаёт ошибки: 1) expected primary-expression before &quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;stdlib.h&gt; using...

Утечка памяти в работе с классами - C++
вроде утечка памяти наблюдается в функции &quot;loadfromfile&quot;, помогите пожалуйста исправить #include &quot;stdafx.h&quot; #include &lt;windows.h&gt; ...

Управление динамической памятью при работе с классами - C++
Всем привет! Есть очень сложный класс, внутри которого есть куча указателей, в его конструкторе все эти указатели получают память при...

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

Ошибка 2 error C2512: Dancer: нет подходящего конструктора по умолчанию (строка 87
и 25)
чем она может быть вызвана?
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
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
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;
п.с: извините за такое огромное количество вопросов.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
11.01.2013, 01:58 #6
Цитата Сообщение от pr1me222 Посмотреть сообщение
исправила, но появился еще один вопрос: программа запускается, однако предлагает вводить данные указанные в первом классе, а в производном от него не выводятся :
извини не понял?
давай еще раз код (исправленный)
и конкретно что нужно и что получается
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
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).
Надеюсь доступно объяснила.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 02:35
Привет! Вот еще темы с ответами:

Ошибки с классами - C++
При создании объекта класса (VSquare) выдает ошибку: ISO C++ forbids declaration of 'VSquare' with no type В чем может быть проблема?

С++ Необъявленный идентификатор при работе с классами. (Функция сравнивает значение свойств объектов) - C++
На идентификаторы power top_speed acceleration weight по 4 раза на каждый матюкается компилятор. Как правильно сравнить их содержимое? ...

Найти ошибки в программе работы с классами - C++
Есть программа, в которой создаются и разрушаются объекты, определенного пользователем класса. Нужно вызвать конструктор и деструктор...

Ошибки в коде с вложеными классами: Невозможно обратиться к private члену - C++
Здорова! Есть код: #include &lt;iostream&gt; using std::cout; #include &lt;afxwin.h&gt; #define IDD_One 1 #define IDD_Two 2 #define...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru