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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
sergey_viper
9 / 3 / 1
Регистрация: 15.04.2012
Сообщений: 185
#1

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

03.06.2013, 19:50. Просмотров 1736. Ответов 3
Метки нет (Все метки)

Помогите с удалением объекта класса:
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++ Параметры объекта класса
В строке первого объекта класса слово MAX длины заменить на слово MAX длины второго объекта класса C++
удаление объекта C++
Удаление объекта C++
C++ Удаление объекта из контейнера
C++ Удаление поля объекта класса - corruption of the heap
Удаление объекта из <vector> C++
Удаление объекта класса из контейнера C++
C++ Создание объекта класса
Удаление объекта из вектора C++
C++ Проверка создания объекта класса BBB из класса AAA и работа с ним

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
447 / 296 / 20
Регистрация: 22.03.2011
Сообщений: 961
Завершенные тесты: 2
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
Сообщений: 185
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
447 / 296 / 20
Регистрация: 22.03.2011
Сообщений: 961
Завершенные тесты: 2
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:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru