Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер.

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2013, 22:20
Ответы с готовыми решениями:

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

Создать обЪект класса , у которого в параметрах конструктора объект этого же класса
Вот код: TOgmGraphicsClass = class of TOgmGraphicsBlock; TOgmGraphicsBlock =...

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

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

16
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
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
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
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.09.2013, 22:42 5
Catstail , Вы думаете что эта строка не смутит человека
C++
1
 (arrObj+i)->put(i);
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.09.2013, 22:46 6
Цитата Сообщение от egor2116 Посмотреть сообщение
Catstail , Вы думаете что эта строка не смутит человека
- а что в ней такого?
0
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.09.2013, 22:52 7
Ничего плохого )). Я просто подумал что автор темы не знает арифметику указателей(только мое предположение) и стока вида
C++
1
arrObj[i].put(i);
ему будет понятней.
1
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
08.09.2013, 23:21  [ТС] 8
egor2116, с вариантом "->" пришлось познакомиться, когда были:

texBox1->label1->Text=...

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



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

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

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

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

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

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

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

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

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


Хорошо, предположим, с вектором можно -- удалить из вектора ремувом и всё? И деструктор не нужен тогда в середине где-нибудь?
0
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
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
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.09.2013, 23:34 11
Вы заталкиваете указатель на В а вектор должен содержать В разыменуйте указатель или используйте просто обьект В, а не указатель на него.
0
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
11.09.2013, 17:05  [ТС] 12
egor2116, а как тогда мне создать кучу "объектов" класса В?

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

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

Как мне тогда создавать объекты класса, чтобы они в векторе могли потом существовать? Если у меня нет конкретного кол-ва переменных\объектов класса В.
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
11.09.2013, 17:21 13
Цитата Сообщение от Nullik Посмотреть сообщение
Как мне тогда создавать объекты класса, чтобы они в векторе могли потом существовать? Если у меня нет конкретного кол-ва переменных\объектов класса В.
в чем сложность динамического создания одного элемента и добавления его в список
0
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
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
11.09.2013, 18:37  [ТС] 15
Ааааа, ёлки!
Всё не могу привыкнуть к тому, что у меня В, это как .. ну как int, char, bool. Я всё думаю что это не тип данных а .. ну как структура\список\лист, что ли. Всоооооо, огромное спасибо!!!
0
погромист
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
11.09.2013, 18:43 16
Цитата Сообщение от Nullik Посмотреть сообщение
структура\список\лист
Тоже тип данных
0
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
11.09.2013, 19:17  [ТС] 17
балин. Ну хорошо, как функция. Что-то такое, сумбурное.
0
11.09.2013, 19:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2013, 19:17
Помогаю со студенческими работами здесь

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Описать объект, имеющий необходимые поля, конструктор, деструктор
Помогите плз

Нужно ли отдельно прописывать деструктор, если одно из полей - объект
Здравствуйте. Немного недопонимаю, в каком случае нужно явно описывать деструктор. Например,...

Деструктор класса
struct date//Структура даты рождения { int d, m, y; }; struct students//Структура студента {...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru