Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383

Иерархия классов. Ошибка при выделении памяти

27.10.2018, 05:10. Показов 1050. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пишу класс Транспортное средство. Столкнулся с несколькими ошибками. Программа запускается. Но при работе выдаётся ошибка "Вызвано исключение: нарушение доступа для чтения.
this было 0xCCCCCCCC." И показывается функция
C++
1
2
3
4
const int Trancport::getvmest() const
{
    return vmest;
}
Тут я где-то очень сильно накосячил с const char * Но не могу с этим разобраться. Также в названии транспорта, например, Жигули, выводится только первая буква.
И ещё одна проблема. Хочу вывести виртуальную функцию, но в этом месте "\nФункция: " << ex[i]->Show() << endl компилятор ругается на <<.

Trancport.h
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
#pragma once
#include <iostream>
#include <conio.h>
 
class Trancport
{
public:
    Trancport();
    Trancport(const char* n, int s, int w, int v);
    Trancport(const Trancport& t);
    const char getname() const;
    const int getMax_speed()const;
    const int getweight() const;
    const int getvmest() const;
    virtual void Show();
 
 
 
    virtual ~Trancport();
 
protected:
    const char* name;
    int Max_speed;
    int weight;
    int vmest;
};
 
class Auto : public Trancport
{
public:
    Auto();
    Auto(const char* n, int s, int w, int v);
    Auto(const Trancport& t);
    void Show() override;
    virtual ~Auto();
 
};
 
class Train : public Trancport
{
public:
    Train();
    Train(const char* n, int s, int w, int v);
    Train(const Trancport& t);
    void Show() override;
 
    virtual ~Train();
 
};
 
class Express : public Trancport
{
public:
    Express();
    Express(const char* n, int s, int w, int v);
    Express(const Trancport& t);
    void Show() override;
 
    virtual ~Express();
};
Trancport.cpp
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
#include "Trancport.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
Trancport::Trancport()
{
    name = 0;
    Max_speed = 0;
    weight = 0;
    vmest = 0;
}
 
Trancport::Trancport(const char* n, int s, int w, int v) 
{
    name = n;
    Max_speed = s;
    weight = w;
    vmest = v;
}
 
Trancport::Trancport(const Trancport& t)
    : name(t.name), Max_speed(t.Max_speed), weight(t.weight), vmest(t.vmest)
{ }
 
void Trancport::Show()
{ }
 
Trancport::~Trancport()
{ }
 
const char Trancport::getname() const
{
    return *name;
}
 
const int Trancport::getMax_speed() const
{
    return Max_speed;
}
 
const int Trancport::getweight() const
{
    return weight;
}
 
const int Trancport::getvmest() const
{
    return vmest;
}
 
 
 
 
Auto::Auto():Trancport()
{ }
 
Auto::Auto(const char* n, int s, int w, int v):Trancport(n, s, w, v)
{ }
 
Auto::Auto(const Trancport& t):Trancport(t)
{ }
 
void Auto::Show()
{
    cout << "Автомобиль";
}
 
Auto::~Auto()
{ }
 
 
 
Train::Train():Trancport()
{ }
 
Train::Train(const char* n, int s, int w, int v) : Trancport(n, s, w, v)
{ }
 
Train::Train(const Trancport& t):Trancport(t)
{ }
 
void Train::Show()
{
    cout << "Поезд";
}
 
Train::~Train()
{ }
 
 
 
Express::Express():Trancport()
{ }
 
Express::Express(const char* n, int s, int w, int v):Trancport(n, s, w, v)
{ }
 
Express::Express(const Trancport& t):Trancport(t)
{ }
 
void Express::Show()
{
    cout << "Экспресс";
}
 
Express::~Express()
{ }
main.cpp
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
#include <iostream>
#include <conio.h>
#include "Trancport.h"
#include <string>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    Trancport *ex[3];
    ex[0] = new Auto("Жигули", 180, 2, 5);
    ex[1] = new Train("Океан", 100, 7, 200);
    ex[3] = new Express("Быстрый", 300, 6, 350);
 
    for(int i = 0; i < 3; i++)
        cout << "Номер" << (i + 1) << "\nНазвание: " << ex[i]->getname() << "\nСкорость: " << ex[i]->getMax_speed()
        << "\nВес (тонны): " << ex[i]->getweight() << "\nВместимость: " << ex[i]->getvmest() << "\nФункция: " << ex[i]->Show() <<  endl;
 
    for (int i = 0; i < 3; ++i)
        delete ex[i];
 
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2018, 05:10
Ответы с готовыми решениями:

Ошибка при выделении памяти
Вопрос: из-за чего программа может рушится? int *NRRow = new int ; int *NRow = new int ; int *NCol = new int ; //тут...

Ошибка при выделении памяти
Здравствуйте, друзья. Подскажите, пожалуйста, почему выскакивает ошибка при повторном выделении память (ведь память в куче удаляется...

Ошибка при выделении памяти
Когда убираю free(buf), то ошибки нету, а когда есть, то вылазит ошибка. Почему такое происходит? #include &lt;stdlib.h&gt; #include...

7
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.10.2018, 07:13
вместо
C++
1
name = n;
используй
C++
1
2
name = new char[strlen(n) + 1];
strcpy(name, n);
и в деструкторе пропиши освобождение памяти
C++
1
2
3
4
Trancport::~Trancport()
{ 
    delete[] name;
}
Добавлено через 10 минут
eganator, конструктор копирования тоже исправь, память под поле name нужно вручную выделять.
Цитата Сообщение от eganator Посмотреть сообщение
но в этом месте "\nФункция: " << ex[i]->Show() << endl компилятор ругается на <<.
у тебя метод Show ничего не возвращает, а по ошибке должен возвращать строку.
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
27.10.2018, 08:25  [ТС]
_stanislav, Точно, спасибо. Реализовывал похожий класс и совсем забыл.
Но теперь ещё здесь ругается на strcpy(name, n); Пишет, что аргумент типа const char* несовместим с параметром типа char*
C++
1
2
3
4
5
Trancport::Trancport(const char* n, int s, int w, int v) 
    : name(new char[strlen(n) + 1]), Max_speed(s), weight(w), vmest(v)
{
    strcpy(name, n);
}
Добавлено через 1 минуту
А по функции получается примерно так будет
C++
1
2
3
4
void Express::Show()
{
    return "Экспресс";
}
Добавлено через 7 минут
Конструктор копирования получается будет выглядеть так?
C++
1
2
3
4
5
Trancport::Trancport(const Trancport& t)
    : name(new char[strlen(t.name) + 1]), Max_speed(t.Max_speed), weight(t.weight), vmest(t.vmest)
{ 
    strcpy(name, t.name);
}
В строке strcpy(name, t.name); таже ошибка получается.

Добавлено через 38 минут
_stanislav,
Цитата Сообщение от eganator Посмотреть сообщение
Но теперь ещё здесь ругается на strcpy(name, n); Пишет, что аргумент типа const char* несовместим с параметром типа char*
С этим разобрался, всё компилируется. Но моя ошибка никуда не делась. Всё тоже самое, что и было изначально.
Цитата Сообщение от eganator Посмотреть сообщение
"Вызвано исключение: нарушение доступа для чтения.
this было 0xCCCCCCCC." И показывается функция

const int Trancport::getvmest() const
{
return vmest;
}
0
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
27.10.2018, 08:34  [ТС]
Вот что получается.
Миниатюры
Иерархия классов. Ошибка при выделении памяти  
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.10.2018, 08:49
Цитата Сообщение от eganator Посмотреть сообщение
Вот что получается.
Цитата Сообщение от eganator Посмотреть сообщение
C++
1
2
3
4
Trancport *ex[3];
ex[0] = new Auto("Жигули", 180, 2, 5);
ex[1] = new Train("Океан", 100, 7, 200);
ex[3] = new Express("Быстрый", 300, 6, 350);
0, 1, 3
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
27.10.2018, 09:35  [ТС]
0x10, Спасибо! Подскажите, пожалуйста, а как быть здесь с выводом слов? Также по одной букве и выходит...

Добавлено через 6 минут
Всё, нашёл ошибку! Спасибо ещё раз!

Добавлено через 24 минуты
_stanislav,
Цитата Сообщение от _stanislav Посмотреть сообщение
у тебя метод Show ничего не возвращает, а по ошибке должен возвращать строку.
Так Show же и не должен ничего возвращать. У него тип void.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.10.2018, 09:47
Цитата Сообщение от eganator Посмотреть сообщение
У него тип void
Тогда зачем ты его используешь с cout?
0
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
27.10.2018, 11:33  [ТС]
nmcf, да, не подумал Тогда получается лучше другой тип использовать? Просто нужно показать работу виртуальности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2018, 11:33
Помогаю со студенческими работами здесь

Ошибка при динамическом выделении памяти
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой веб-страницы: http://cppstudio.com/post/9555/...

Ошибка при динамическом выделении памяти
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR; пишит недопустимый неполный тип на struct подчеркивает...

Ошибка при выделении памяти с помощью malloc
Помогите выдает ошибку в рядочке :&quot;Ar = ( far *)malloc(size*sizeof(int));&quot; полный текст програмы: #include &quot;stdafx.h&quot; using...

Ошибка при выделении памяти динамически для структуры
Есть программа. Вылетает ошибка. Если gets(BLOCKNOTE.NAME) заменить на cin&gt;&gt;BLOCKNOTE.NAME все работает нормально. Хотелось бы ипользовать...

Ошибка при выделении памяти под двумерный массив
#include &lt;iostream&gt; using namespace std; class array { int size1, size2; char **matr; public: array(int n1, int n2); ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru