Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
11.03.2013, 23:17     Вылетает программа при обращении к объекту класса #1
итак, есть абстрактный базовый класс "дерево", есть два его наследника: плодовое дерево и лесное дерево. Надо написать класс "Контейнер деревьев" на базе массива
программа вылетает с сообщением "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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 23:17     Вылетает программа при обращении к объекту класса
Посмотрите здесь:

Доступ к объекту базового класса при закрытом наследовании C++
C++ При повторном обращении к объекту меняется его содержимое
C++ Программа вылетает при добавлении элемента
C++ При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему?
C++ При обращении к индексу двумерного массива char программа вылетает с ошибкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 23:56     Вылетает программа при обращении к объекту класса #2
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);
...
Попытка обратиться (через []) в область невыделенной памяти.
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
12.03.2013, 00:20  [ТС]     Вылетает программа при обращении к объекту класса #3
вот здесь же выделяется, при добавлении:
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;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 01:46     Вылетает программа при обращении к объекту класса #4
Да, 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;
    }
Yandex
Объявления
12.03.2013, 01:46     Вылетает программа при обращении к объекту класса
Ответ Создать тему
Опции темы

Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru