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

Создание неоднородного списка при помощи абстрактных классов

11.01.2016, 19:04. Показов 1226. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой при создании неоднородного списка при помощи абстрактных классов, помогите)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2016, 19:04
Ответы с готовыми решениями:

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как...

Список абстрактных классов
Здравствуйте! Прошу помочь с одной проблемой. Суть проблемы в следующем - есть 2 разных класса...

Использование абстрактных классов
Простите заранее за нубский вопрос. Давно ничего не программировал, а тут понадобилось. Скачал...

Объекты и экземпляры абстрактных классов
Здравствуйте, помогите, пожалуйста, разобраться: Суть в чем - экземпляры абстрактных классов...

9
5 / 4 / 2
Регистрация: 16.08.2013
Сообщений: 41
11.01.2016, 19:08 2
Какого рода проблема?
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
11.01.2016, 20:04  [ТС] 3
я не знаю как передавать указатель который будет указывать на начало списка, попозже напишу примерный код, сейчас над ним работаю, мин через 30

Добавлено через 46 минут
вот примерный текст программы , не работает
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
#define _CRT_SECURE_NO_WARNINGS
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define newDBG_NEW
#endif
#endif
 
 
#include <iostream>
#include <Windows.h>
#include <string>
 
#include <cstdio>
#include <fstream>
using namespace std;
typedef class systemm *sysm;
typedef class employee *empl;
typedef class manager *manag;
class systemm {
public:
    systemm *next_s;
    void print_list(sysm &e)
    {
        sysm prin = e;
        while (prin != NULL)
        {
            prin->print();
            prin = prin->next_s;
        }
        system("pause");
    }
    virtual void inster(sysm &e) = 0;
    virtual void print() = 0;
};
class employee : public systemm {
public:
    int x;
    double y;
    employee *next;
    void inster(sysm &e){
        empl new_e = new employee;
        new_e->x = 13;
        y = 13.5;
        if (e == NULL){
            new_e->next = NULL;
            e = new_e;
        }
        else{
            new_e->next_s = e;
            e=new_e;
        }
 
    };
    void print(){
        cout << x << "   " << y << endl;
    };
};
class manager : public systemm {
public:
    int t, x, y;
    manag *next;
    void inster(sysm &e){   
        manag new_e = new manager;
        new_e->t = 9;
        new_e->x = 16;
        new_e->y = 136;
        if (e == NULL){
            new_e->next = NULL;
            e = new_e;
        }
        else{
            new_e->next_s = e;
            e = new_e;
        }
 
    };
    void print(){
        cout << t << "  " << x << "   " << y << endl;
    };
};
int main()
{
    sysm p=NULL; // создание указателя базового типа
    
    p->inster(p);
    p->inster(p);
    p->print_list(p);
 
    
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
    _CrtDumpMemoryLeaks();
    return 0;
}
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.01.2016, 20:12 4
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от Uneour Посмотреть сообщение
sysm p=NULL; // создание указателя базового типа
p->inster(p);
C++
1
2
3
sysm p=NULL;   //<--- никуда не указывает
 
p->inster(p); //<--- UB, вызов метода для несуществующего объекта
1
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
12.01.2016, 00:17  [ТС] 5
C++
1
sysm p=NULL; // это указатель ,указывает на 0
в данной программе, это все равно что написать:
C++
1
systemm *p=NULL;//это не объект
Проблема в том что у меня вызывается функция
C++
1
insert(sysm &e);
и компилятор не понимает к какому классу ее отнести

Добавлено через 7 минут
Если возникает вопрос почему sysm p=NULL; является указателем , то выше есть код который это делает а именно:
C++
1
typedef class systemm *sysm;
Добавлено через 3 часа 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
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
#include <iostream>
#include <Windows.h>
#include <string>
 
#include <cstdio>
#include <fstream>
using namespace std;
typedef class systemm *sysm;
typedef class employee *empl;
typedef class manager *manag;
class systemm {
public:
    systemm *next_s;
    void print_list(sysm &e)
    {
        sysm prin = e;
        while (prin != NULL)
        {
            prin->print();
            prin = prin->next_s;
        }
        system("pause");
    }
    void system_inster(sysm &e)
    {
        int i;
        cout << "Напишите 1 если хотите добавить работника и 2 если менеджера\n";
        cin >> i;
        if (i == 1)
        {
            if (e == NULL)
            {
                empl new_e = new employee;
                new_e->inster();
                new_e->next_s = NULL;
                e = new_e;
            }
            else {
                empl new_e = new employee;
                new_e->inster();
                new_e->next_s = e;
                e = new_e;
            }
        }
        else if (i == 2)
        {
            if (e == NULL){
                manag new_e = new manager;
                new_e->inster();
                new_e->next_s = NULL;
                e = new_e;
            }
            else {
                manag new_e = new manager;
                new_e->inster();
                new_e->next_s = e;
                e = new_e;
            }
        }
 
    }
    virtual void inster() = 0;
    virtual void print() = 0;
};
class employee : public systemm {
public:
    int x;
    double y;
    employee *next;
    void inster(){
        //empl new_e = new employee;
        x = 13;
        y = 13.5;
        
    };
    void print(){
        cout << x << "   " << y << endl;
    };
};
class manager : public systemm {
public:
    int t, x, y;
    manag *next;
    void inster(){  
        t = 9;
        x = 16;
        y = 136;
    };
    void print(){
        cout << t << "  " << x << "   " << y << endl;
    };
};
int main()
{
    sysm p=NULL; // создание указателя базового типа
    p->system_inster(p);
    p->system_inster(p);
    p->print_list(p);
    return 0;
}
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2016, 00:40 6
Цитата Сообщение от Uneour Посмотреть сообщение
Объясните пожалуйста какие ошибки я допустил в этом коде
см #4
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
12.01.2016, 00:45 7
говорите так, будто у вас ошибка компиляции. однако это http://cpp.sh/82fo почему-то компилится.
т.е. какая там у вас проблема пока что не ясно. если все-таки в рантайме - то тут уже сказали что вы
пытаетесь что-то там позвать у нульпоинтера.
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
12.01.2016, 15:53  [ТС] 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#define _CRT_SECURE_NO_WARNINGS
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define newDBG_NEW
#endif
#endif
 
 
#include <iostream>
#include <Windows.h>
#include <string>
 
#include <cstdio>
#include <fstream>
using namespace std;
typedef class systemm *sysm;
typedef class employee *empl;
typedef class manager *manag;
class employee;
class manager;
class systemm {
public:
    systemm *next_s;
    void print_list(sysm &e)
    {
        sysm prin = e;
        while (prin != NULL)
        {
            prin->print();
            prin = prin->next_s;
        }
        system("pause");
    }
    void system_inster(sysm &e);
    virtual void print() = 0;
};
class employee : public systemm {
public:
    int x;
    double y;
    employee *next;
    employee()
    {
        x = 16;
        y = 145.5;
    };
    void print(){
        cout << x << "   " << y << endl;
    };
};
class manager : public systemm {
public:
    int t, x, y;
    manag *next;
    manager()
    {
        t = 9;
        x = 16;
        y = 136;
    };
    void print(){
        cout << t << "  " << x << "   " << y << endl;
    };
};
int main()
{
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
    sysm p=NULL; // создание указателя базового типа
    p->system_inster(p);
    p->system_inster(p);
    p->print_list(p);
 
    system("pause");
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
    _CrtDumpMemoryLeaks();
    return 0;
}
void systemm::system_inster(sysm &e)
{
    int i;
    cout << "Напишите 1 если хотите добавить работника и 2 если менеджера\n";
    cin >> i;
    if (i == 1)
    {
        if (e == NULL)
        {
            e = new employee();
            e->next_s = NULL;
        }
        else {
        empl new_e = new employee;
        new_e->next_s = e;
        e = new_e;
        }
        }
        else if (i == 2)
        {
        if (e == NULL){
        manag new_e = new manager;
        new_e->next_s = NULL;
        e = new_e;
        }
        else {
        manag new_e = new manager;
        new_e->next_s = e;
        e = new_e;
        }
    }
 
}
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2016, 19:45 9
Цитата Сообщение от Uneour Посмотреть сообщение
там где вы говорили ошибки нет
я не писал, что там есть ошибка.
я писал, что код содержит UB.
и сейчас он у вас по прежнему содержит UB.

я дважды обратил ваше внимание на вопиющий факт UB в коде.
вы дважды проигнорировали этот момент,
не сумев понять суть проблемы.

я делаю вывод:
вы не осознаете какую мину замедленного действия заложили в свой код.
вы не понимаете, как работает ваш код.

если вы полагаете, что это нормально:
дергать методы по нулевому указателю,
тогда примите мои поздравления:
ещё одним быдлокодером стало больше.


Цитата Сообщение от Uneour Посмотреть сообщение
смотрите внимательнее мои комментарии
меня не интересуют ваши комментарии.
вполне достаточно просто прочитать ваш код.

лекарство:

http://rextester.com/BQAQAZ46251
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
#include <iostream>
#include <fstream>
#include <string>
 
struct systemm 
{
    systemm* next_s;
    
    
    virtual ~systemm() {}
    
    virtual void print()const = 0;
    
    void print_list(systemm* e)const
    {
        systemm* prin = e;
        while(prin)
            prin = (prin->print(), prin->next_s);
    }
    
    static void system_inster(systemm*& e);
    
    static void free(systemm*& e)
    {
        systemm* cur = e;
        systemm* old = nullptr;
        while(cur)
            old=cur,
            cur = cur->next_s,
            delete old;
    }
};
 
struct employee : systemm 
{
    virtual ~employee() { std::cout << "employee: dtor\n"; }
    
    employee():x(16), y(145.5){};
    virtual void print()const override { std::cout << x << "   " << y << '\n'; }
 
    int x;  double y;
};
 
struct manager : systemm 
{
    virtual ~manager() { std::cout << "manager: dtor\n"; }
    
    manager():t(9), x(16), y(136){}
    
    virtual void print()const{ std::cout << t << "  " << x << "   " << y << '\n'; }
    
    int t, x, y; 
};
 
 
void systemm::system_inster(systemm*& e)
{
    int i;
    std::cout << "Напишите 1 если хотите добавить работника и 2 если менеджера\n";
    std::cin >> i;
    
    if (i == 1)
    {
        if(!e)
            e = new employee,
            e->next_s = nullptr;
        else
        {
            employee* new_e = new employee;
            new_e->next_s = e;
            e = new_e;
        }
    }
    else if (i == 2)
    {
        if (!e)
            e = new manager,
            e->next_s = nullptr;
        else 
        {
            auto* new_e = new manager;
            new_e->next_s = e;
            e = new_e;
        }
    }
}
 
 
int main()
{
    systemm* p=nullptr;
    systemm::system_inster(p);
    p->system_inster(p);
    p->print_list(p);
    systemm::free(p);
}
в нормальном коде объекты самостоятельно умеют за собой прибираться.

однако, в данном случае,
чистить память приходится вручную.
при этом пришлось ввести дополнительную статическую функцию-член systemm::free.

такой вот говнокод.
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
12.01.2016, 21:27  [ТС] 10
спасибо, за подробный ответ, нас научили выделять память а потом за собой чистить, как ты и говоришь, я считал это нормой , я пересмотрю взгляд на это
0
12.01.2016, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2016, 21:27
Помогаю со студенческими работами здесь

Поиск в массиве абстрактных классов
Добрый вечер, подскажите, у меня есть абстрактный класс назавем его X(выводит на экран), он имеет...

Отличие Абстрактных классов от Интерфейсов
Может кто определить по основным пунктам отличия Абстрактных классов от Интерфейсов? Читал...

Реализовать калькулятор, при помощи пользовательских классов
Мне нужно сделать калькулятор, при помощи классов. Учитывая скобки( например: 3-2*(3+5)) Классы...

ООП, понимание абстрактных классов/методов и т.п
Работаю программистом и столкнулся с тем, что на проекте отказались от абстрактного класса в пользу...


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

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