Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
beginer coder
0 / 0 / 0
Регистрация: 14.01.2017
Сообщений: 22
1

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

15.01.2017, 15:26. Просмотров 496. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2017, 15:26
Ответы с готовыми решениями:

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

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

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

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

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

4
retmas
Жарю без масла
865 / 747 / 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
beginer coder
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
likehood
989 / 831 / 397
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
15.01.2017, 16:09 4
Цитата Сообщение от beginer coder Посмотреть сообщение
функция add не имеет перегрузки в данном классе
Правильно говорит компилятор. Только не перегрузки (overload), а переопределения (override). Всё потому, что в базовом классе функция объявлена как void add(), а в производном - как void add(Base**). А должно быть одинаково.
0
Undisputed
621 / 239 / 55
Регистрация: 10.06.2014
Сообщений: 2,029
Завершенные тесты: 3
15.01.2017, 16:17 5
Цитата Сообщение от beginer coder Посмотреть сообщение
компилятор говорит что нельзя создать абстрактный класс, типа функция add не имеет перегрузки в данном классе...
Создать абстрактный класс можно, его экземпляры нельзя создавать.
Если в классе есть хотя бы один абстрактный метод, этот класс является абстрактным.

Будь возможность создать объект абстрактного класса, значит была бы и возможность вызова метода который не определен. И что по вашему в таком случае должно было бы произойти? obj.notImplementedMethod() .... ???
0
15.01.2017, 16:17
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2017, 16:17

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

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

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


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

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

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