0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
1

Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки?

03.11.2016, 18:08. Показов 2642. Ответов 9

Не знаю как правильно здесь реализовать метод добавления и удаления объектов в хранилище без перегрузки. Заранее спасибо.


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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
template <class Type>
    class Storage
{
private:
    int top;
    Type *s;
public:
    
Storage() {
    top = 0;
}
 
void add(Type var) {
 
        Type *a=new Type[top+1];
        for(int i=0;i<top;i++) a[i]=s[i];
        a[top]= var;
        top++;  
delete s;
        s = a;
}
 
void remove(int p) {    
 
        Type var = s[p];
        s[p] = NULL;
        delete var;
        top--;
    }
 
void getInfo() {
    for(int i=0;i<10;++i)
    s[i]->getInfo();
}
 
Type& getObject(int p) {
    return s[p];
}
 
int getCount() {
    return top;
}
 
~Storage()
{
//  delete s;
}
 
};
    
class Object{
private:
    int x;
public:
 
Object() {
    x = rand()%10+1;
//  cout << "Obj" << endl;
}
 
Object(int X){
    x = X;
}
 
void getInfo(){ 
//  if(x!=0 && x<1000)
    cout << x << " ";
}
 
void SomeMethod(int k){
    x += k;
}
 
};
                                                                                                                                                                                                                
                                                                                                                                                                                                                
                                                                                                                                                                                                                
int main(){
    Storage <Object*> storage;
 
    cout << " Start: ";
    Object bh[10];
 
    for(int i=0;i<10;++i)
    {
        storage.add(&bh[i]); //?
    }
 
        //cout << "Info"<< endl;
        storage.getInfo();
 
    cout << endl << "Method: ";
    for(int i=0;i<storage.getCount();++i)
    {
        storage.getObject(i)->SomeMethod(1);
    }
        storage.getInfo();
 
    cout << endl << "Delete: ";
//  storage.remove(2);
    storage.getInfo();
cout << endl;
//storage.getObject(2)->getInfo(); // remove
//storage.getObject(4)->getInfo();
 
cout << endl << endl << endl << endl << "Objects in storage: " << storage.getCount() << endl;
 
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2016, 18:08
Ответы с готовыми решениями:

Как реализовать метод добавления и удаления в listbox
Не могу создать ни одного объекта, они получаются с пустым именем и 0 лет. Я знаю что при создании...

Реализовать дек как массив, создать процедуры добавления и удаления
надо реализовать дек через массив. такой вопрос. дек - это как бэ очередь с возможностями...

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

Как реализовать метод добавления массива int в динамический массив
Банально, реализую свой динамический массив. В интерфейсе все как положено //Добавление в...

9
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
03.11.2016, 18:23 2
так а что не так? у вас уже все сделано ж вроде...

Добавлено через 1 минуту
удаление правда не правильно сделано

Добавлено через 8 минут
у вас удаляется один элемент и помечается как NULL и декрементируется счетчик (при этом пропадает последний элемент) а ваш удаленный так и остается на своем "месте".

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

что-то типа:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void remove(int p) {  
     if (top > 1)
     {
        Type var = s[p];
        s[p] = NULL;
        delete var;
        Type *a=new Type[top-1];
        int shift = 0;
        for(int i=0;i<top;i++) { 
           if (s[i] == NULL) {
              shift++;
              continue;
           }
           a[i-shift]=s[i];
        }
        delete []s;
        s = a;  
    } else {
      delete []s;
      s = NULL;
    }
        top--;
}
Добавлено через 1 минуту
ну и по хорошему проверки на индекс сделать, что бы за пределы массива не вылазить
1
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
03.11.2016, 19:05  [ТС] 3
В добавлении тоже перегрузка. Из - за строки delete s; . Не знаю почему так происходит. Код проверяю через Dev-C++.
0
Комп_Оратор)
Эксперт по математике/физике
8775 / 4514 / 608
Регистрация: 04.12.2011
Сообщений: 13,462
Записей в блоге: 16
03.11.2016, 19:16 4
Цитата Сообщение от Киловат Посмотреть сообщение
В добавлении тоже перегрузка.
Операционная система перезагружается?
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
03.11.2016, 19:17 5
что подразумеваете под "перегрузка" ? явно не то, что все остальные здесь
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
03.11.2016, 19:24  [ТС] 6
С системой все хорошо)

Выполнение программы полностью прерывается как на картинке ниже
Миниатюры
Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки?  
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
03.11.2016, 20:01  [ТС] 7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Операционная система перезагружается?
Все хорошо с системой. Дело либо в компиляторе, либо в программе. Склоняюсь больше ко 2-му варианту.
0
Комп_Оратор)
Эксперт по математике/физике
8775 / 4514 / 608
Регистрация: 04.12.2011
Сообщений: 13,462
Записей в блоге: 16
03.11.2016, 22:09 8
Киловат, я прошёл по списку, но не трогал объекта. Оператор << перегрузите сами. Я не стал связываться с методом GetInfo так как это связывает список и тип его объекта нехорошо. Остальное -сами.
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
template <class Type>
    class Storage
{
private:
    int top;
    Type *s;
public:
    
Storage()
:s(nullptr), top(0)
{}
 
void add(Type var) {
     
        Type *a=new Type[top+1];        
 
        for(int i=0;i<top;i++) a[i]=s[i];
        a[top]= var;
        top++;  
//delete s;
delete[]s;//вы же выделяете new[] ??
        s = a;
}
void remove(int p) {    
 Type *a=new Type[top-1];
 int j=0;
 for(int i=0;i<top;i++)
 {
if(i != p)a[j++]=s[i];
 }
delete[]s;
s = a;    
       top--;
    }
 
void getInfo() {
   // for(int i=0;i<10;++i)
  //  s[i]->getInfo();
    for(int i=0;i<top;++i)
        cout<<s[i]<<' ';//пусть клиентский код перегрузит << для своего T ))
}
 
Type& getObject(int p) {
    return s[p];
}
 
int getCount() {
    return top;
}
 
~Storage()
{
  if(s) delete []s;
}
 
};
 
//я это не буду делать но советую, до шаблонных списков и др. шаблонов
//сначала разобаться с элементарными вещами в классах (с одним int внутри - то что надо)
    class Object{
private:
    int x;//тут вы его не достанете
public:
 
Object() {
    x = rand()%10+1;
//  cout << "Obj" << endl;
}
 
Object(int X){
    x = X;
}
 
void getInfo(){ 
//  if(x!=0 && x<1000)
    cout << x << " ";
}
 
void SomeMethod(int k){
    x += k;
}
 
};
                                                                                                                                                                                                                
                                                                                                                                                                                                                
                                                                                                                                                                                                                
int main(){
    Storage <int> storage;
 
    cout << " Start: ";
    
    for(int i=0;i<10;++i)
    {
        storage.add(i); //?
    }
 
        //cout << "Info"<< endl;
        storage.getInfo();
 
    
 
cout << endl ; 
 
system("pause");
return 0;
};
2
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
04.11.2016, 12:09  [ТС] 9
Наиогромнейшее спасибо всем за помощь Информация была оооооочень полезна для меня )
0
Комп_Оратор)
Эксперт по математике/физике
8775 / 4514 / 608
Регистрация: 04.12.2011
Сообщений: 13,462
Записей в блоге: 16
04.11.2016, 12:22 10
Цитата Сообщение от Киловат Посмотреть сообщение
Информация была оооооочень полезна для меня
Рад помочь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2016, 12:22
Помогаю со студенческими работами здесь

Интерактивная схема с возможностью добавления/удаления/перемещения объектов в Run-Time
Доброго времени суток! Появилась задача разработать интерактивную карту телефонной связи, т.е....

Столкновение объектов. Как правильно реализовать?
Здравствуйте! Пишу игру в танчики. Borland C++ 3.1. Сейчас реализовал работу с клавиатурой,...

Реализовать простой стек, с функциями добавления и удаления элементов
Реализовать простой стек на си, с функциями добавления в стек и удаления из него, а также проверки...

Реализовать стек с двумя очередями используя массивы (операции удаления, добавления)
Очень вас прошу! Программа по С++! Нужно реализовать стек с помощью двух очередей используя...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru