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

Вылетает программа при обращении к объекту класса

11.03.2013, 23:17. Показов 1298. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
итак, есть абстрактный базовый класс "дерево", есть два его наследника: плодовое дерево и лесное дерево. Надо написать класс "Контейнер деревьев" на базе массива
программа вылетает с сообщением "17.ехе" прекращает работу, виндоус ищет пути предотвращения проблемы и т.д.

head.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
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef _TREEE_
#define _TREEE_
#include <iostream>
#include <cmath>
using namespace std;
enum Type {list, hvoy};
class Tree{
protected:
    friend class Cont;
    const int ID;
    char * Name;
    unsigned Age;
    const Type Tip;
    static int ID_Repository;
    static public void SetID_Repository (int a) {ID_Repository=a;}
public:
    Tree();//what the fuck?
    Tree(char * aName, unsigned aAge, Type aTip);
    Tree (const Tree& Ob);
    virtual ~Tree();
    int GetID() const ;
    char * GetName () const;
    unsigned GetAge () const;
    Type GetTip ()const;
    bool operator < (const Tree & e) const;
    bool operator == (const Tree & e) const;
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    virtual void InStream (ostream& out)=0;
    void Print ();
    void operator = (const Tree & e);
};
class LesTree: public Tree {
protected:
    double Drev;
public:
    LesTree();
    LesTree(char * aName, unsigned aAge, Type aTip, double aDrev);
    LesTree (const LesTree& Ob);
    ~LesTree();
    int GetID() const;
    char * GetName () const;
    unsigned GetAge () const;
    double GetDrev () const;
    Type GetTip ()const;
    bool operator < (const LesTree & e) const{return Tree::operator < (e);}
    bool operator == (const LesTree & e) const{return Tree::operator == (e);}
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void SetDrev (double aDrev);
    void InStream (ostream& out);
    LesTree& operator = (const LesTree & e);
};
class PlodTree : public Tree{
    protected:
    double Mas;
    double Hran;
public:
    PlodTree();
    PlodTree(char * aName, unsigned aAge, Type aTip, double Mas, double Hran);
    PlodTree (const PlodTree& Ob);
    ~PlodTree();
    int GetID() const;
    char * GetName () const;
    unsigned GetAge () const;
    double GetMas () const;
    double GetHran () const;
    Type GetTip ()const;
    bool operator < (const PlodTree & e) const {return Tree::operator <(e);}
    bool operator == (const PlodTree & e) const {return Tree::operator == (e);}
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void SetMas (double aMas);
    void SetHran (double aHran);
    void InStream (ostream& out);
    PlodTree& operator = (const PlodTree & e);
};
class Cont {
    Tree **info;
    int capacity,count;
public:
    Cont(int an=3):capacity(an),count(0){
        info=new Tree*[capacity];
    }
    ~Cont (){
        delete []info;
        count=0;
    }
    bool isEmpty(){return (count==0);}
    bool Add (const Tree& a){
        if (count==capacity) return false;
        if (typeid(a)==typeid(LesTree))
            *info=new LesTree;
        else *info=new PlodTree;
            *info[count++]=a;
        return true;
    }
    void Print (){
        for (int i=0;i<count;i++)
        {
            (*info[i]).InStream(cout);
            cout<<endl;}
    }
    Tree& operator [] (int i){
        return *info[i];}
    int ListCounter (){
        int listcount=0;
        for (int i=0;i<count;i++)
            if ((*info[i]).Tip==list) listcount++;
        return listcount;}
    void SortName (){
        for (int i=0;i<count;i++)
            for (int j=0;j<count-1;j++)
                if (strcmp((*info[i]).Name,(*info[i+1]).Name)>0){
                    char * s=new char[strlen((*info[i]).Name)+1];
                    strcpy(s,(*info[i]).Name);
                    delete [](*info[i]).Name;
                    (*info[i]).Name=new char[strlen((*info[i+1]).Name)+1];
                    strcpy((*info[i]).Name,(*info[i+1]).Name);
                    delete [](*info[i+1]).Name;
                    (*info[i+1]).Name=new char[strlen(s)+1];
                    strcpy((*info[i+1]).Name,s);
                    delete []s;}
    }
    void SortAge(){
        for (int i=0;i<count;i++)
            for (int j=0;j<count-1;j++)
                if( (*info[i]).Age<(*info[i+1]).Age)
                {
                    (*info[i]).Age+=(*info[i+1]).Age;
                    (*info[i+1]).Age=(*info[i]).Age-(*info[i+1]).Age;
                    (*info[i]).Age-=(*info[i+1]).Age;
                }
    }
};
#endif
real.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "head.h"
char *tip[2]={"Лиственное","Хвойное"};
int Tree::ID_Repository = 0;
Tree::Tree():ID(ID_Repository++),Age(100),Tip(list){
    char * s = "Дуб";
    Name=new char[strlen(s)+1];
    strcpy(Name,s);
    delete s;
}
Tree::Tree(char * aName, unsigned aAge, Type aTip):ID(ID_Repository++),Age(aAge),Tip(aTip){
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
Tree::Tree (const Tree& Ob):Age(Ob.Age),Tip(Ob.Tip),ID(ID_Repository++){
    Name=new char [strlen(Ob.Name)+1];
    strcpy(Name,Ob.Name);
}
Tree::~Tree(){
    delete []Name;
}
int Tree::GetID() const {
    return ID;
}
char * Tree::GetName () const{
    char * s=new char[strlen(Name)+1];
    strcpy (s,Name);
    return s;
}
unsigned Tree::GetAge () const{
    return Age;
}
Type Tree::GetTip ()const{
    return Tip;
}
bool Tree::operator < (const Tree & e) const{
    if (strcmp(Name,e.Name)<0)
        return true;
    return false;
}
bool Tree::operator == (const Tree & e) const{
    if (strcmp(Name,e.Name)==0)
        return true;
    return false;
}
void Tree::SetAge (unsigned aAge){
    Age=aAge;
}
void Tree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
void Tree::operator = (const Tree & e){}
void Tree::Print (){
    cout<<"Возраст: "<<Age<<" Тип: "<<tip[Tip]<<" Имя: ";
    puts(Name);
}
LesTree::LesTree():Tree("Дуб",100,list),Drev(23){}
LesTree::LesTree(char * aName, unsigned aAge, Type aTip, double aDrev):Tree(aName, aAge, aTip),Drev(aDrev){}
LesTree::LesTree (const LesTree& Ob):Tree(Ob.Name,Ob.Age,Ob.Tip),Drev(Ob.Drev){}
LesTree::~LesTree(){}
int LesTree::GetID() const {return ID;}
char * LesTree::GetName () const{
    char * s=new char[strlen(Name)+1];
    strcpy(s,Name);
    return s;}
unsigned LesTree::GetAge () const {return Age;}
double LesTree::GetDrev () const {return Drev;}
Type LesTree::GetTip ()const {return Tip;}
void LesTree::SetAge (unsigned aAge){Age=aAge;}
void LesTree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
void LesTree::SetDrev (double aDrev){Drev=aDrev;}
void LesTree::InStream (ostream& out){
    out<<"Имя: "<<Name<<" Возраст: "<<Age<<" Идентификатор: "<<ID<<" Масса древесины: "<<Drev<<" Тип: "<<tip[Tip];}
LesTree& LesTree::operator = (const LesTree & e){
    if (&e!=this)
    {
        Age=e.Age;
        delete []Name;
        Name=new char [strlen(e.Name)+1];
        strcpy(Name,e.Name);
        Drev=e.Drev;}
    return *this;
}
PlodTree::PlodTree():Tree("Яблоня",10,list),Mas(10.5),Hran(3){}
PlodTree::PlodTree(char * aName, unsigned aAge, Type aTip, double aMas, double aHran):Tree(aName,aAge,aTip),Mas(aMas),Hran(aHran){}
PlodTree::PlodTree (const PlodTree& Ob):Tree(Ob.Name,Ob.Age,Ob.Tip),Mas(Ob.Mas),Hran(Ob.Hran){}
PlodTree::~PlodTree(){}
int PlodTree::GetID() const {return ID;}
char * PlodTree::GetName () const {
    char *s=new char[strlen(Name)+1];
    strcpy(s,Name);
    return s;}
unsigned PlodTree::GetAge () const {return Age;}
double PlodTree::GetMas () const {return Mas;}
double PlodTree::GetHran () const {return Hran;}
Type PlodTree::GetTip ()const {return Tip;}
//bool PlodTree::operator < (const PlodTree & e) const;//?
//bool PlodTree::operator == (const PlodTree & e) const;//?
void PlodTree::SetAge (unsigned aAge){Age=aAge;}
void PlodTree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);}
void PlodTree::SetMas (double aMas) {Mas=aMas;}
void PlodTree::SetHran (double aHran){Hran=aHran;}
void PlodTree::InStream (ostream& out){
    out<<"Имя: "<<Name<<" Возраст: "<<Age<<" Идентификатор: "<<ID<<" Масса плода: "<<Mas<<" Время хранения: "<<Hran<<" Тип: "<<tip[Tip];}
PlodTree& PlodTree::operator = (const PlodTree & e){
    if (this!=&e)
    {
        Age=e.Age;
        Mas=e.Mas;
        Hran=e.Hran;
        delete []Name;
        Name=new char [strlen(e.Name)+1];
        strcpy(Name,e.Name);
    }
    return *this;
}
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
26
27
28
29
30
31
32
#include "head.h"
int main ()
{
    setlocale (LC_ALL,".1251");
    PlodTree pa("Груша",1,list,0,0);
    PlodTree pb("Яблоня",13,list,12,6);
    if (pa<pb)
        cout<<"first is less then second"<<endl;
    else cout<<"second is less then first"<<endl;
    if(pa==pb)
        cout<<"they are equal"<<endl;
    else cout<<"they are not equal"<<endl;
    Cont a;
    cout<<"input age"<<endl;
    double Age, Drev;
    cin>>Age;
    cout<<"input Drev"<<endl;
    cin>>Drev;
    LesTree la("Сосна",Age,hvoy,Drev);
    while (a.Add(la))
    {
        cout<<"input age"<<endl;
        double Age, Drev;
        cin>>Age;
        cout<<"input Drev"<<endl;
        cin>>Drev;
        LesTree la("Сосна",Age,hvoy,Drev);
    }
    a[2].InStream(cout);
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.03.2013, 23:17
Ответы с готовыми решениями:

При обращении к индексу двумерного массива char программа вылетает с ошибкой
Программа вылетает с ошибкой на 66й строке. Почему?((( // Task_1.cpp : Defines the entry point for the console application. // ...

Ошибка при обращении к объекту другого класса
Когда пытаюсь с класса Drone вызвать через его объект функцию из класса Widget то появляется такая ошибка: ошибка: 'Widget' does not name...

Получить некоторое поле при обращении к объекту, созданному из класса
Здравствуйте, уважаемые У меня есть простой класс class Test{ constructor( note ){ this.note = note; } }

3
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 23:56
C++
1
2
3
Cont(int an=3):capacity(an),count(0){
        info=new Tree*[capacity];
    }
Создаётся массив указателей, но память под указатели не выделяется. Потом (в main()):
C++
1
2
3
4
5
...
Cont a;
...
a[2].InStream(cout);
...
Попытка обратиться (через []) в область невыделенной памяти.
0
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
12.03.2013, 00:20  [ТС]
вот здесь же выделяется, при добавлении:
C++
1
2
3
4
5
6
bool Add (const Tree& a){
        if (count==capacity) return false;
        if (typeid(a)==typeid(LesTree))
            *info=new LesTree;
        else *info=new PlodTree;
            *info[count++]=a;
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 01:46
Да, add() я проглядел. Но вылетает имеено здесь:
C++
1
a[2].InStream(cout);
если индекс не 0. Получается, что память выделяется только под один указатель.

Добавлено через 38 минут
Попутно:
C++
1
2
3
4
5
6
7
Tree::Tree():ID(ID_Repository++),Age(100),Tip(list)
{
    char *s = "Дуб";
    Name = new char[strlen(s) + 1];
    strcpy(Name, s);
    //delete s; // !!! память не выделялась, что тогда освобождается?
}
Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool Add (const Tree& a)
    {
        if (count == capacity) return false;
        
        if (typeid(a) == typeid(LesTree))
             info[count] = new LesTree;
        else info[count] = new PlodTree;
        
        *info[count++] = a;
        
        return true;
    }
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
~Cont ()
    {
        for (int i = 0; i < count; ++i)
            delete info[i];
        delete [] info;
        count = 0;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2013, 01:46
Помогаю со студенческими работами здесь

Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту
Всем доброго здравия! Имеется программа, которая считывает имена каталогов, на основании этих имён создаёт объекты. Код: main.cpp: ...

Ошибки при косвенном обращении к объекту
struct StructurClientData { unsigned int data_ip4; unsigned int id; DWORD system_id; HANDLE system_handle; SOCKET...

Программа вылетает при объявлении переменной класса
При создании переменной класса tree программа вылетает. Не понимаю, в чём дело. Что я не так делаю? Класс tree - бинарное дерево ...

Вылетает программа при использовании функции класса
Есть класс Match: #include &quot;coefficient.h&quot; #include &quot;team.h&quot; #include &lt;QString&gt; #include &lt;QList&gt; class Match { public: ...

При повторном обращении к объекту меняется его содержимое
Добрый день! У меня такая странная проблема: есть две одинаковые строчки кода подряд: cout &lt;&lt; testTree.rightSon-&gt;siz...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru