0 / 0 / 0
Регистрация: 14.01.2017
Сообщений: 22
1

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?

15.01.2017, 15:26. Показов 1078. Ответов 4
Метки нет (Все метки)

я хотел так, но программа просто падает
C++
1
2
3
4
5
6
7
8
9
10
void Student::add(Base** head) {
    cout << "I here" << endl;
    this->setName(); //все функции сет просто берут данные из клавиатуры
    this->setAge();
    this->setSex();
    this->setFakult();
    this->setKafedr();
    Base::addElement(); //инкремент статического элемента
    *(head + number) = this;
}
падает в main сразу после вывода "create"
C++
1
2
3
4
5
    
    Base* a;
    static Student *b;
    cout << "create" << endl;
    b->add(&a);
если нужно весь код, пишите

Добавлено через 14 минут
добавил весь код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//sourse.cpp
#include <iostream>
#include <Windows.h>
#include "Base.h"
#include "Student.h"
using namespace std;
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    
    Base* a;
    static Student *b;
    cout << "create" << endl;
    b->add(&a);
    
 
 
 
    system("pause>>void");
    return 0;
}
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
#pragma once
 
#include <iostream>
#include <string>
using namespace std;
 
extern string STATUS[3];
class Base
{
protected:
    int age;
    string sex;
    string name;
    string fakult;
    string kafedr;
    float salary; //заробітня плата або стипендія +
    string status; //статус особи в університеті    +
    static int number; //рахує кількість об'єктів
public:
    Base();
    Base(int, string, string, string, string);
    Base(const Base&);
    //далі сети
    void setAge();
    void setSex();
    void setName();
    virtual void setFakult() = 0;
    virtual void setKafedr() = 0;
    virtual void setSalary() = 0;
    virtual void setStatus() = 0;
    static void addElement();
    static void deleteElement();
    static void deleteAllElement();
    //далі ґети
    int getAge();
    string getSex();
    string getName();
    string getFakult();
    string getKafedr();
    float getSalary();
    string getStatus();
    //функція додавання себе у список та вивід списку ( все по покажчику на базовий клас
    virtual void add() = 0;
    //virtual void show() = 0;
    virtual ~Base();
};
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
#include "Base.h"
int Base::number = 0;
Base::Base() { 
    age = 0;
    sex = "";
    name = "";
    fakult = "";
    kafedr = "";
    salary = 0;
    status = "";
    
}
Base::Base(const Base& ob) {
    age = ob.age;
    sex = ob.sex;
    name = ob.name;
    fakult = ob.fakult;
    kafedr = ob.kafedr;
    salary = ob.salary;
    status = ob.status;
    
}
Base::Base(int Age, string Sex, string Name, string Fakult, string Kafedr) {
    age = Age;
    sex = Sex;
    name = Name;
    fakult = Fakult;
    kafedr = Kafedr;
}
void Base::setName() {
    cout << "Введіть ім'я даної особи: ";
    cin.get();
    getline(cin, name);
}
void Base::setAge() {
    cout << "Введіть вік " << this->getName() << ": ";
    cin >> age;
}
void Base::setSex() {
    cout << "Введи 0, якщо " << this->getName() << "жінка, введи будь-яке число, якщо чоловік: ";
    int temp;
    cin >> temp;
    if (temp == 0)
        sex = "жінка";
    else
        sex = "чоловік";
}
void Base::addElement() {
    Base::number++;
}
void Base::deleteElement() {
    Base::number--;
}
void Base::deleteAllElement() {
    Base::number = 0;
}
float Base::getSalary() {
    return salary;
}
string Base::getStatus() {
    return status;
}
string Base::getFakult() {
    return fakult;
}
string Base::getKafedr() {
    return kafedr;
}
int Base::getAge() {
    return age;
}
string Base::getSex() {
    return sex;
}
string Base::getName() {
    return name;
}
Base::~Base() {
    
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include <iostream>
#include <string>
#include "Base.h"
 
using namespace std;
class Student :
    public Base
{
    
public:
    Student();
    Student(int, string, string, string, string);
    Student(const Student&);
    virtual void setStatus();
    virtual void setSalary();
    virtual void setFakult();
    virtual void setKafedr();
    virtual void add(Base**);
    //virtual void show();
    virtual ~Student();
};
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
#include "Student.h"
#include <iostream>
#include <string>
using namespace std;
 
Student::Student() {
    age = 0;
    sex = "";
    name = "";
    fakult = "";
    kafedr = "";
    this->setStatus();
    
    
}
Student::Student(int Age, string Sex, string Name, string Fakult, string Kafedr) {
    age = Age;
    sex = Sex;
    name = Name;
    fakult = Fakult;
    kafedr = Kafedr;
    this->setStatus();
}
Student::Student(const Student& ob) {
    age = ob.age;
    sex = ob.sex;
    name = ob.name;
    fakult = ob.fakult;
    kafedr = ob.kafedr;
    salary = ob.salary;
    status = ob.status;
    
}
void Student::setStatus() {
    status = "студент";
    this->setSalary();
}
void Student::setSalary() {
    salary = 816.75;
}
void Student::setFakult() {
    cout << "Введи назву факультета на якому навчається данний студент: ";
    cin.get();
    getline(cin, fakult);
}
void Student::setKafedr() {
    cout << "Введи кафедру: ";
    cin.get();
    getline(cin, kafedr);
}
void Student::add(Base** head) {
    cout << "I here" << endl;
    this->setName();
    this->setAge();
    this->setSex();
    this->setFakult();
    this->setKafedr();
    Base::addElement();
    *(head + number) = this;
 
}
/*
void Student::show() {
    cout << "Інформація про студента:" << endl;
    cout << "\tім'я:";
}
*/
Student::~Student() {
    
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2017, 15:26
Ответы с готовыми решениями:

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; }...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод...

4
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2017, 15:31 2
Цитата Сообщение от beginer coder Посмотреть сообщение
C++
1
2
3
static Student *b;
...
b->add(&a);
для того, чтобы использовать указатель(разыменовывать, получать доступ к данным), он должен указывать на что-то валидное.
вопрос: на что указывает ваш указатель?
ответ: пальцем в ж...небо
0
0 / 0 / 0
Регистрация: 14.01.2017
Сообщений: 22
15.01.2017, 16:00  [ТС] 3
дело в том, что когда я хочу сделать static Student *b = new Student; компилятор говорит что нельзя создать абстрактный класс, типа функция add не имеет перегрузки в данном классе...
вот те ошибки
C++
1
2
3
Error   1   error C2259: 'Student' : cannot instantiate abstract class  e:\onedrive\3 семестр\лабки з ооп 3 семестр\підготовка до екзамену\лабка №5 1 вар (2)\лабка №5 1 вар (2)\source.cpp  14  1   лабка №5 1 вар (2)
    2   IntelliSense: object of abstract class type "Student" is not allowed:
            pure virtual function "Base::add" has no overrider  e:\OneDrive\3 семестр\Лабки з ООП 3 семестр\підготовка до екзамену\лабка №5 1 вар (2)\лабка №5 1 вар (2)\Source.cpp  14  26  лабка №5 1 вар (2)
0
1270 / 1027 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
15.01.2017, 16:09 4
Цитата Сообщение от beginer coder Посмотреть сообщение
функция add не имеет перегрузки в данном классе
Правильно говорит компилятор. Только не перегрузки (overload), а переопределения (override). Всё потому, что в базовом классе функция объявлена как void add(), а в производном - как void add(Base**). А должно быть одинаково.
0
785 / 385 / 77
Регистрация: 10.06.2014
Сообщений: 2,457
15.01.2017, 16:17 5
Цитата Сообщение от beginer coder Посмотреть сообщение
компилятор говорит что нельзя создать абстрактный класс, типа функция add не имеет перегрузки в данном классе...
Создать абстрактный класс можно, его экземпляры нельзя создавать.
Если в классе есть хотя бы один абстрактный метод, этот класс является абстрактным.

Будь возможность создать объект абстрактного класса, значит была бы и возможность вызова метода который не определен. И что по вашему в таком случае должно было бы произойти? obj.notImplementedMethod() .... ???
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2017, 16:17
Помогаю со студенческими работами здесь

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp,...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной ситуации на...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru