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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
08.09.2013, 22:20     Динамический объект класса и деструктор #1
Добрый вечер.

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

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* вариантом
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 22:20     Динамический объект класса и деструктор
Посмотрите здесь:

C++ деструктор класса
Когда вызывается деструктор класса? C++
Одномерный динамический массив(конструктор и деструктор) C++
Деструктор класса C++
Деструктор абстрактного класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
08.09.2013, 22:27     Динамический объект класса и деструктор #2
можно ли так же, через new, сделать с классами?
можно

C++
1
2
3
4
5
int count;
B * b;
cout<<"Введите количество обьектов";
cin>>count;
b=new B[count];
Если в кратце то деструктор тебе нужен если ты выдиляешь память внутри класса.
Catstail
Модератор
 Аватар для Catstail
21487 / 10240 / 1668
Регистрация: 12.02.2012
Сообщений: 17,120
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;
}
mr_Skat
 Аватар для mr_Skat
6 / 6 / 1
Регистрация: 11.08.2013
Сообщений: 29
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
.

Деструктор действует только для элиментов класса, и играет роль при копровании и перегрузке классов с элиментами с динамически выделеной памятю.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
08.09.2013, 22:42     Динамический объект класса и деструктор #5
Catstail , Вы думаете что эта строка не смутит человека
C++
1
 (arrObj+i)->put(i);
Catstail
Модератор
 Аватар для Catstail
21487 / 10240 / 1668
Регистрация: 12.02.2012
Сообщений: 17,120
08.09.2013, 22:46     Динамический объект класса и деструктор #6
Цитата Сообщение от egor2116 Посмотреть сообщение
Catstail , Вы думаете что эта строка не смутит человека
- а что в ней такого?
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
08.09.2013, 22:52     Динамический объект класса и деструктор #7
Ничего плохого )). Я просто подумал что автор темы не знает арифметику указателей(только мое предположение) и стока вида
C++
1
arrObj[i].put(i);
ему будет понятней.
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
08.09.2013, 23:21  [ТС]     Динамический объект класса и деструктор #8
egor2116, с вариантом "->" пришлось познакомиться, когда были:

texBox1->label1->Text=...

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



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

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

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

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

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

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

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

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

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


Хорошо, предположим, с вектором можно -- удалить из вектора ремувом и всё? И деструктор не нужен тогда в середине где-нибудь?
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
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
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
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:\.......
Т.е., мне нужно в вектор "поочерёдно" заталкивать элементы, а не все сразу.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
10.09.2013, 23:34     Динамический объект класса и деструктор #11
Вы заталкиваете указатель на В а вектор должен содержать В разыменуйте указатель или используйте просто обьект В, а не указатель на него.
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
11.09.2013, 17:05  [ТС]     Динамический объект класса и деструктор #12
egor2116, а как тогда мне создать кучу "объектов" класса В?

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

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

Как мне тогда создавать объекты класса, чтобы они в векторе могли потом существовать? Если у меня нет конкретного кол-ва переменных\объектов класса В.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.09.2013, 17:21     Динамический объект класса и деструктор #13
Цитата Сообщение от Nullik Посмотреть сообщение
Как мне тогда создавать объекты класса, чтобы они в векторе могли потом существовать? Если у меня нет конкретного кол-ва переменных\объектов класса В.
в чем сложность динамического создания одного элемента и добавления его в список
AlexCore
2 / 2 / 0
Регистрация: 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);
    }
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
11.09.2013, 18:37  [ТС]     Динамический объект класса и деструктор #15
Ааааа, ёлки!
Всё не могу привыкнуть к тому, что у меня В, это как .. ну как int, char, bool. Я всё думаю что это не тип данных а .. ну как структура\список\лист, что ли. Всоооооо, огромное спасибо!!!
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
11.09.2013, 18:43     Динамический объект класса и деструктор #16
Цитата Сообщение от Nullik Посмотреть сообщение
структура\список\лист
Тоже тип данных
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 19:17     Динамический объект класса и деструктор
Еще ссылки по теме:

C++ Не срабатывает деструктор и дочернего класса
C++ Конструктор и деструктор анонимного класса
C++ Объект с указателем - деструктор

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

Или воспользуйтесь поиском по форуму:
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
11.09.2013, 19:17  [ТС]     Динамический объект класса и деструктор #17
балин. Ну хорошо, как функция. Что-то такое, сумбурное.
Yandex
Объявления
11.09.2013, 19:17     Динамический объект класса и деструктор
Ответ Создать тему
Опции темы

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