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

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

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

Здравствуйте, столкнулся с проблемой при создании неоднородного списка при помощи абстрактных классов, помогите)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2016, 19:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание неоднородного списка при помощи абстрактных классов (C++):

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

Реализовать калькулятор, при помощи пользовательских классов
Мне нужно сделать калькулятор, при помощи классов. Учитывая скобки( например:...

Как данную программу реализовать при помощи классов
как данную программу реализовать при помощи классов ~cpp ...

Модель электронного устройства с использованием абстрактных классов
Здравствуйте, уважаемые форумчане! Продолжаю готовиться к экзамену по Real...

Нюансы использования абстрактных базовых классов (класс Shape)
У меня класс Point наследуется с абстрактного базового класса Shape, и Point...

Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи
Создать программу с абстрактным базовым классом и множественным наследованием,...

9
Nik-Hander
2 / 2 / 1
Регистрация: 16.08.2013
Сообщений: 39
11.01.2016, 19:08 #2
Какого рода проблема?
0
Uneour
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
hoggy
Заблокирован
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
Uneour
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
hoggy
Заблокирован
12.01.2016, 00:40 #6
Цитата Сообщение от Uneour Посмотреть сообщение
Объясните пожалуйста какие ошибки я допустил в этом коде
см #4
0
Perfilov
264 / 164 / 56
Регистрация: 25.02.2015
Сообщений: 435
12.01.2016, 00:45 #7
говорите так, будто у вас ошибка компиляции. однако это http://cpp.sh/82fo почему-то компилится.
т.е. какая там у вас проблема пока что не ясно. если все-таки в рантайме - то тут уже сказали что вы
пытаетесь что-то там позвать у нульпоинтера.
0
Uneour
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
hoggy
Заблокирован
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
Uneour
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
12.01.2016, 21:27  [ТС] #10
спасибо, за подробный ответ, нас научили выделять память а потом за собой чистить, как ты и говоришь, я считал это нормой , я пересмотрю взгляд на это
0
12.01.2016, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2016, 21:27
Привет! Вот еще темы с решениями:

Создание абстрактных видов данных
Здравствуйте, помогите пожалуйста решить задачу: Перегрузить операции &lt;, &gt;...

Создание класса абстрактных объектов
Добрый день/утро/вечер. Возник вопрос,скорее теоретического характера. Есть...

Текст помощи в виде линейного списка
Текст помощи для некоторой программы организован в виде линейного списка....

Реализация списка + Шаблоны классов
Всем добрый день, есть не большая проблема с реализацией списка с помощью...


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

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

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