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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Класс-контейнер? Что это такое и с чем его «едят»? http://www.cyberforum.ru/cpp-beginners/thread806077.html
Вечер добрый, столкнулся со следующей проблемой, в общем, есть задание: Создать класс-контейнер, который является абстракцией текста и состоит из линейных объектов и методов для добавления строки в тексте, удаление строки из текста, очистить текст, получить длину самой длинной строки. Ну, я как обычно, перед тем как писать код, начал шариться по нету и собирать информацию, теорию и т.д. и...
C++ Перегрузка классов struct Massiv { int n; int *p; Massiv () { p=0; n=0; } Massiv (int *y,int n) http://www.cyberforum.ru/cpp-beginners/thread806075.html
Вещественные массивы С[4][5], D[4][5] C++
Помогите дописать программу!!!! Использование функций, получающих и возвращающих более одного значения. Даны вещественные массивы С, D. Для каждого массива определить: 1) среднее арифметическое положительных элементов; 2) количество отрицательных элементов. #include <iostream.h>
C++ Компонент для обработки голоса через микрофон
Здравствуйте подскажите какую нужно скачать библиотеку Embarcadero RAD Studio XE, для распознавания речевых команд?
C++ Среднее арифметическое отрицательныъ элементов массива в С++ http://www.cyberforum.ru/cpp-beginners/thread806022.html
Ввести с клавиатуры одномерный массив X из N элементов целого типа.Количество N предварительно ввести с клавиатуры(не более 15). Сформировать одномерный массив Y в соответствии с номером варианта.Тип элементов массива Y определить в соответствии со смыслом задания. Результат вывести в виде таблицы. http://cs309320.vk.me/v309320968/5718/otpwYgSqrxc.jpg Задание №22 - находится по этой ссылке. ...
C++ Рекуррентная формула Задачка: Дано начальное значение a0=2 и рекуррентная формула {a}_{i}=(2+({a}_{i-1})^2)/2*{a}_{i-1} . Найти номер первого элемента, превысившего введенное с клавиатуры число. подробнее

Показать сообщение отдельно
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
11.03.2013, 23:17     Вылетает программа при обращении к объекту класса
итак, есть абстрактный базовый класс "дерево", есть два его наследника: плодовое дерево и лесное дерево. Надо написать класс "Контейнер деревьев" на базе массива
программа вылетает с сообщением "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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 07:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru