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

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой при создании неоднородного списка при помощи абстрактных классов, помогите)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2016, 19:04
Ответы с готовыми решениями:

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

Список абстрактных классов
Здравствуйте! Прошу помочь с одной проблемой. Суть проблемы в следующем - есть 2 разных класса (Например, Photo и Music). Реализация этих...

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

9
 Аватар для Nik-Hander
5 / 4 / 2
Регистрация: 16.08.2013
Сообщений: 41
11.01.2016, 19:08
Какого рода проблема?
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
11.01.2016, 20:04  [ТС]
я не знаю как передавать указатель который будет указывать на начало списка, попозже напишу примерный код, сейчас над ним работаю, мин через 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
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.01.2016, 20:12
Лучший ответ Сообщение было отмечено 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  [ТС]
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
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2016, 00:40
Цитата Сообщение от Uneour Посмотреть сообщение
Объясните пожалуйста какие ошибки я допустил в этом коде
см #4
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
12.01.2016, 00:45
говорите так, будто у вас ошибка компиляции. однако это http://cpp.sh/82fo почему-то компилится.
т.е. какая там у вас проблема пока что не ясно. если все-таки в рантайме - то тут уже сказали что вы
пытаетесь что-то там позвать у нульпоинтера.
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
12.01.2016, 15:53  [ТС]
вот работающий код, там где вы говорили ошибки нет, смотрите внимательнее мои комментарии ( в данной программе отсутствует освобождение свободной памяти (потеря данных))
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
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2016, 19:45
Цитата Сообщение от 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  [ТС]
спасибо, за подробный ответ, нас научили выделять память а потом за собой чистить, как ты и говоришь, я считал это нормой , я пересмотрю взгляд на это
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2016, 21:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru