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

Удаление объекта класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
sergey_viper
9 / 3 / 1
Регистрация: 15.04.2012
Сообщений: 177
03.06.2013, 19:50     Удаление объекта класса #1
Помогите с удалением объекта класса:
C++
1
2
3
4
5
6
void badstuddel(Student spis[], int n)
    {
        for(int i=0;i<n;i++)
        if(spis[i].getpoint()<4)
          delete (* spis)[i];
    }
ВЫдаёт:
C++
1
C:\Users\Сергей\Downloads\mod7rand (2).cpp|105|error: no match for 'operator[]' in '* spis[i]'|
Если же я делаю просто:
C++
1
2
3
4
5
6
void badstuddel(Student spis[], int n)
    {
        for(int i=0;i<n;i++)
        if(spis[i].getpoint()<4)
          delete spis[i];
    }
То:
C++
1
C:\Users\Сергей\Downloads\mod7rand (2).cpp|105|error: type 'class Student' argument given to 'delete', expected pointer|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2013, 19:50     Удаление объекта класса
Посмотрите здесь:

Объявление объекта одного класса в описании другого класса C++
C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
C++ Передача объекта методу другого объекта другого класса
Использование объекта одного класса при создании нового класса C++
В строке первого объекта класса слово MAX длины заменить на слово MAX длины второго объекта класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
03.06.2013, 19:51     Удаление объекта класса #2
Вы удаляете обьект стека.
C++
1
2
3
4
5
6
void badstuddel(Student* spis[], int n)
{
------
delete spis[i]; //удаление обьекта, при этом Вы должны сами проследить/знать лежит ли обьект в куче или был создан на стеке.
------
}
sergey_viper
9 / 3 / 1
Регистрация: 15.04.2012
Сообщений: 177
03.06.2013, 21:02  [ТС]     Удаление объекта класса #3
Цитата Сообщение от stima Посмотреть сообщение
Вы удаляете обьект стека.
C++
1
2
3
4
5
6
void badstuddel(Student* spis[], int n)
{
------
delete spis[i]; //удаление обьекта, при этом Вы должны сами проследить/знать лежит ли обьект в куче или был создан на стеке.
------
}
Всё равно что-то не то.
Исходник:
Кликните здесь для просмотра всего текста
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
#include <string.h>
#include <iostream>
 
using namespace std;
 
 
struct points
    {
        int Matan;
        int AGandLA;
        int English;
        int Programming;
        int Molecular;
        int AP;
    };
 
struct date
    {
        char day[3];
        char month[3];
        int year;
    };
 
class Student{
        char name[30];
        date d;
        char adr[30],fac[20] ;
        int kurs;
        points p;
    public:
        Student();
        int getkurs();
        int getpoint();
        void show();
 
};
 
Student::Student()
{
    cout<<"Input name:";
    cin>>name;
    cout<<"Input date of born:\n";
    cout<<"Day:";
    cin>>d.day;
    cout<<"Month:";
    cin>>d.month;
    cout<<"Year:";
    cin>>d.year;
    cout<<"Input adr:";
    cin>>adr;
    cout<<"Input fac:";
    cin>>fac;
    cout<<"Input kurs:";
    cin>>kurs;
    cout<<"Input E.P.:\n";
    cout<<"Mathematical analysis:";
    cin>>p.Matan;
    cout<<"AG&LA:";
    cin>>p.AGandLA;
    cout<<"Programming:";
    cin>>p.Programming;
    cout<<"English:";
    cin>>p.English;
    cout<<"Molecular physics:";
    cin>>p.Molecular;
    p.AP=(p.AGandLA+p.English+p.Matan+p.Molecular+p.Programming)/5;
 
 
 
}
void Student::show()
{
    cout<<"Name:"<<name<<endl;
    cout<<"Was born:"<<d.day<<'.'<<d.month<<'.'<<d.year<<endl;
    cout<<"Address:"<<adr<<endl;
    cout<<"Fac:"<<fac<<endl;
    cout<<"Kurs:"<<kurs<<endl;
    cout<<"E.P.:"<<endl;
    cout<<"Mathematical analysis:"<<p.Matan<<endl;
    cout<<"Programming:"<<p.Programming<<endl;
    cout<<"AG&LA:"<<p.AGandLA<<endl;
    cout<<"English:"<<p.English<<endl;
    cout<<"Molecular physics:"<<p.Molecular<<endl;
    cout<<endl<<endl<<"---------"<<endl<<endl;
}
 
int Student::getpoint() {return p.AP;}
 
int Student::getkurs() {return kurs;}
 
void badstud(Student spis[], int n)
    {
        int i,k;
        cout<<"Input the course:"; cin>>k;
        cout<<endl<<endl;
        for(i=0;i<n;i++)
        if((spis[i].getkurs()==k)&&(spis[i].getpoint()<4))
            spis[i].show();
    }
void badstuddel(Student* spis[], int n)
 
    {
        for(int i=0;i<n;i++)
        if(spis[i].getpoint()<4)
          delete spis[i];
    }
 
 
int main()
{
    Student *spis;
    int n;
    cout<<"Input a number of students:"; cin>>n;
    spis=new Student[n];
    for(int i=0;i<n;i++)
        {
        cout<<endl<<endl;
        spis[i].show();
        }
badstud(spis,n);
badstuddel(spis,n);
    for(int i=0;i<n;i++)
        {
        cout<<endl<<endl;
        spis[i].show();
        }
delete [] spis;
cout<<"Press any key!";
 
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
03.06.2013, 22:06     Удаление объекта класса #4
это выделение и удаление массива обьектов
C++
1
2
A *a = new A[count];
delete[] a;
это выделение и удаление массива указателей на обьекты, а также выделение и удаление обьектов.
C++
1
2
3
4
5
6
7
8
9
10
11
A **a = new A*[count];
for (int i = 0; i < count; ++i)
     a[i] = new A();
 
for (int i = 0; i < count; ++i)
{
     delete a[i];
     a[i] = NULL;
}
 
delete[] a;
Вы можете использовать оба. Оба верны. Просто память управляется по разному. В чем разница?
1. В первом случае, Вы "не удаляете" обьект, а просто "помечаете" его удаленным. А также Вы можете указать место для создание нового обьекта.
C++
1
2
3
A *a = new A[count];
a[5]->~A();
new(a[5]) A;
2. Во втором случае вы удаляете обьект.
C++
1
2
3
A **a = new A*[count];
a[5] = new A;
delete a[5];
3. Как вы заметили второй случай более понятный, но требует перерасхода на память (count * sizeof(void*))

Соответственно Ваши 2 функции должны использовать один из предложенных методов.
Yandex
Объявления
03.06.2013, 22:06     Удаление объекта класса
Ответ Создать тему
Опции темы

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