Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Nullik
43 / 12 / 4
Регистрация: 13.03.2013
Сообщений: 302
Завершенные тесты: 2
#1

Динамический объект класса и деструктор - C++

08.09.2013, 22:20. Просмотров 1680. Ответов 16
Метки нет (Все метки)

Добрый вечер.

Есть класс, конструктор и деструктор:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class B {
int a;
public:
B ();
~B ();
};
 
B::B ()
{
a=10;
}
 
B::~B()
{
cout << "удалили объект класса";
}

Предположим, в коде main нам нужно сделать несколько объектов класса В, но только пользователь знает сколько.

Как сделать неопределённое кол-во классов?
Например, как мы делаем динамический массив:

C++
1
2
3
4
int n;
int* a;
a = new int[n];
for....
можно ли так же, через new, сделать с классами?

Хорошо, предположим, пользователь сделал 10 объектов класса и вдруг понял, что один из них ему не нужен, ему нужно удалить объект класса, а потом ему нужно будет ещё сделать 10 объектов класса.

Как удалить объект класса в середине?
А по завершению программы?
*пойдёт ли использование деструктора и как его использовать? В книге не очень хорошо написано, не могу понять именно с new* вариантом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 22:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамический объект класса и деструктор (C++):

Динамический объект класса
Нужно создать динамический объект класса, на примере кода ниже. Я создал...

Объект с указателем - деструктор
Доброе время... Скажите пожалуйста class a { private: b* alga; n...

Одномерный динамический массив(конструктор и деструктор)
Может кто чем поможет по решению задачи?или подскажите где искать заранее...

Деструктор класса
Имеется собственный класс, возник вопрос, деструктор класса вызывается не явно...

Деструктор класса
когда мы вызываем деструктор, для удаления динамического массива к примеру,...

деструктор класса
Здравствуйте! Я скопировал код отсюда...

16
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
08.09.2013, 22:27 #2
можно ли так же, через new, сделать с классами?
можно

C++
1
2
3
4
5
int count;
B * b;
cout<<"Введите количество обьектов";
cin>>count;
b=new B[count];
Если в кратце то деструктор тебе нужен если ты выдиляешь память внутри класса.
1
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
08.09.2013, 22:35 #3
Да, все можно. Вот твой, но чуть подправленный код:

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
#include <iostream.h>
 
class B {
int a;
public:
B ();
~B ();
put(int k);
};
 
B::B ()
{
a=0;
}
 
B::~B()
{
cout << "ГіГ¤Г*ëèëè îáúåêò Г± a=" << a << endl;
}
 
B::put(int k)
{
    a=k;
}
 
int main(int argc, char* argv[])
{
    int i,n;
 
    cout << "n="; // спросим, сколько объектов создавать
    cin >> n;
 
    B *arrObj = new B[n]; // создаем массив объектов
 
    for (i=0; i<n; i++) (arrObj+i)->put(i);  // заносим числа в a
 
    delete [] arrObj; // все удаляем
 
    return 0;
}
1
mr_Skat
7 / 7 / 3
Регистрация: 11.08.2013
Сообщений: 33
08.09.2013, 22:39 #4
Во первых создать динамически обьэкт класса :

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# include <iosytram>
using namespace std;
 
class test {
     int nam;
public :
     test () {
        nam=0;
      }
      void set () {
          cout << "Enter nam : ";
          cin >> nam;
       }
       void get () {
            cout << nam << "\n";
       }
};
 
int man () {
    const int n=10;
    test *obj = new test [n];
    
     delete [] obj;
}
Чтоб удалить из середины необходимо создать новый обьэкт, перекопировать старый массив без лишнего элимента,
старый указатель удалить и присвоить новое значение
C++ (Qt)
1
obj=obj_2
.

Деструктор действует только для элиментов класса, и играет роль при копровании и перегрузке классов с элиментами с динамически выделеной памятю.
1
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
08.09.2013, 22:42 #5
Catstail , Вы думаете что эта строка не смутит человека
C++
1
 (arrObj+i)->put(i);
0
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
08.09.2013, 22:46 #6
Цитата Сообщение от egor2116 Посмотреть сообщение
Catstail , Вы думаете что эта строка не смутит человека
- а что в ней такого?
0
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
08.09.2013, 22:52 #7
Ничего плохого )). Я просто подумал что автор темы не знает арифметику указателей(только мое предположение) и стока вида
C++
1
arrObj[i].put(i);
ему будет понятней.
1
Nullik
43 / 12 / 4
Регистрация: 13.03.2013
Сообщений: 302
Завершенные тесты: 2
08.09.2013, 23:21  [ТС] #8
egor2116, с вариантом "->" пришлось познакомиться, когда были:

texBox1->label1->Text=...

что то там такое было, да. но вариант с точной мне больше нравится



Хорошо. тогда подскажите вот такой момент:

Вот в примере я выделила память под int переменную.
Потом я захотела сделать ещё.
НО, весь класс я храню в файле и в векторе (т.е., у меня задача - класс должен уметь делать запись в файл). Предположим, я добавлю в вектор и всё - мне больше "объект класса" не нужен -- удалить его что ли? Выходит, одним динамическим объектом я смогу сделать сколько угодно, потому что у меня будет вектор, в который я смогу в любой момент добавить и удалить, хранение ещё будет в файле, а класс, чтобы правильно записать. Так?

Или я вообще что-то неправильное говорю?

Задача у класса: чтение и запись в файл (методы класса, точнее). А ещё вывод и ввод с экрана\на экран.

Поэтому, я предполагала, что внутри программы будет вектор. Класс - чтобы заполнить вектор. (двумерный вектор и несколько полей у класса, если что)
Класс, чтобы его распечатать, в текущий момент, класс - чтобы его записать в файл, и класс, чтобы его извлечь из файла.
Т.е., я даже не совсем могу представить как это делать, но мысли пока что такие.

Добавлено через 12 минут
Оговорюсь: все 4 метода делать будет 1 класс.

Добавлено через 7 минут
Перечитала ответы, ещё раз уточню для себя:

При помощи new мы сделали динамический массив с типом В, так?

О, а вектор можно? Я тут подумала, что с вектором было бы проще "добавить и удалить", потому что и пользователь не знает размер и захочет то добавлять элементы, то удалять их.


Хорошо, предположим, с вектором можно -- удалить из вектора ремувом и всё? И деструктор не нужен тогда в середине где-нибудь?
0
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
08.09.2013, 23:25 #9
C++
1
2
3
4
vector<B> v;
B * b = new B[10];
For(int i=0;i<10;i++)
V.push_back(b[i]);
А выше я говорил не про -> это ))) а про arrObj +i
1
Nullik
43 / 12 / 4
Регистрация: 13.03.2013
Сообщений: 302
Завершенные тесты: 2
09.09.2013, 19:15  [ТС] #10

Не по теме:

ааааа, ну да, вы правы, не совсем понятно. А что это означало? Arr это массив из В, и меняется, суммируется массив и i, -- это изменение указателя на "ячейку" или ссылки?



Добавлено через 12 часов 19 минут
Подскажите, пожалуйста, ещё вот что:

//B - class
//diskk_new - vector<B>

B *CreateNewBook = new B;
diskk_new.push_back(CreateNewBook);
Можно ли так сделать?
Хотя я думаю, что у меня тут ошибка: точку подчёркивает и пишет:

отсутствуют экземпляры перегруженная функция "std::vector<_Ty, _Ax>:: push_back [с _Ty=BOOK2, _Ax=std::allocator<BOOK2>]", соответствующие списку аргументов c:\.......
Т.е., мне нужно в вектор "поочерёдно" заталкивать элементы, а не все сразу.
0
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
10.09.2013, 23:34 #11
Вы заталкиваете указатель на В а вектор должен содержать В разыменуйте указатель или используйте просто обьект В, а не указатель на него.
0
Nullik
43 / 12 / 4
Регистрация: 13.03.2013
Сообщений: 302
Завершенные тесты: 2
11.09.2013, 17:05  [ТС] #12
egor2116, а как тогда мне создать кучу "объектов" класса В?

Т.е., проблема такая:

У меня есть вектор с типом В. В вектор надо по одному складывать. Можно даже так: 3 раза сложили, 1 раз удалили, 4 раза сложили, 2 удалили и т.д.

Как мне тогда создавать объекты класса, чтобы они в векторе могли потом существовать? Если у меня нет конкретного кол-ва переменных\объектов класса В.
0
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
11.09.2013, 17:21 #13
Цитата Сообщение от Nullik Посмотреть сообщение
Как мне тогда создавать объекты класса, чтобы они в векторе могли потом существовать? Если у меня нет конкретного кол-ва переменных\объектов класса В.
в чем сложность динамического создания одного элемента и добавления его в список
0
AlexCore
2 / 2 / 2
Регистрация: 28.08.2013
Сообщений: 26
11.09.2013, 17:23 #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vector <B> vec;
    int n;
    cout << "Input n: ";
    cin >> n;
 
    // or vector <B> vec(n);
 
    for(int i = 0;i < n; ++i){
        B temp;
        vec.push_back(temp);
    }
 
    // check
 
    vec.erase (vec.begin() + 1,vec.begin() + n - 1);
 
    cout << "Again input n: ";
    cin >> n;
 
    for(int i = 0;i < n; ++i){
        B temp;
        vec.push_back(temp);
    }
1
Nullik
43 / 12 / 4
Регистрация: 13.03.2013
Сообщений: 302
Завершенные тесты: 2
11.09.2013, 18:37  [ТС] #15
Ааааа, ёлки!
Всё не могу привыкнуть к тому, что у меня В, это как .. ну как int, char, bool. Я всё думаю что это не тип данных а .. ну как структура\список\лист, что ли. Всоооооо, огромное спасибо!!!
0
coloc
погромист
411 / 247 / 30
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
11.09.2013, 18:43 #16
Цитата Сообщение от Nullik Посмотреть сообщение
структура\список\лист
Тоже тип данных
0
Nullik
43 / 12 / 4
Регистрация: 13.03.2013
Сообщений: 302
Завершенные тесты: 2
11.09.2013, 19:17  [ТС] #17
балин. Ну хорошо, как функция. Что-то такое, сумбурное.
0
11.09.2013, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 19:17
Привет! Вот еще темы с решениями:

Деструктор абстрактного класса
Почему деструктор абстрактного класса нужно делать виртуальным?

Деструктор класса список
Доброго времени суток. Создал класс односвязный список. Не знаю как сделать...

Когда вызывается деструктор класса?
Вопрос собственно в том, когда происходит освобождение памяти, занимаемой...

Не срабатывает деструктор и дочернего класса
Собственно, такие дела. Использую наследование, несколько цепочек одного от...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru