Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Киловат
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 47
#1

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

03.11.2016, 18:08. Просмотров 238. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2016, 18:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки? (C++):

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

Необходимо реализовать интерфейс на С++ который позволял бы производить операции удаления, добавления и выборки товаров, баз и закупок - C++
Есть база в SQLite Товары - код товара. Наименование,Марка, цена, описание Базы - код базы, наименование, адрес, телефон Товары на...

Реализовать приложение, содержащее функции добавления нового элемента в массив и удаления элемента из массива. (Имитируется “резиновый” массив) - C++
Реализовать приложение, содержащее функции добавления нового элемента в массив и удаления элемента из массива. (Имитируется “резиновый”...

Перестала работать программа после добавления перегрузки - C++
Доброго времени суток ,пожалуйста помогите разобраться добавил в программу перегрузку после чего программа стала работать криво , не могу...

Как переделать friend-перегрузки ввода/вывода в метод класса? - C++
Доброго времени суток! Есть вопрос: как переделать френдовые перегрузки ввода\вывода в метод класса? Или же как шаблонить френдовые...

Добавить в программу конструкторы, копирования, удаления и перегрузки - C++
Очень срочно надо переработать прогу, позарез, буду примного благодарен. Надо всего добавить в прогу конструкторы, копирования и...

9
Maxim Prishchepa
Эксперт С++
1923 / 1035 / 74
Регистрация: 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
Сообщений: 47
03.11.2016, 19:05  [ТС] #3
В добавлении тоже перегрузка. Из - за строки delete s; . Не знаю почему так происходит. Код проверяю через Dev-C++.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
03.11.2016, 19:16 #4
Цитата Сообщение от Киловат Посмотреть сообщение
В добавлении тоже перегрузка.
Операционная система перезагружается?
0
Maxim Prishchepa
Эксперт С++
1923 / 1035 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
03.11.2016, 19:17 #5
что подразумеваете под "перегрузка" ? явно не то, что все остальные здесь
0
Киловат
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 47
03.11.2016, 19:24  [ТС] #6
С системой все хорошо)

Выполнение программы полностью прерывается как на картинке ниже
0
Миниатюры
Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки?  
Киловат
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 47
03.11.2016, 20:01  [ТС] #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Операционная система перезагружается?
Все хорошо с системой. Дело либо в компиляторе, либо в программе. Склоняюсь больше ко 2-му варианту.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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
Сообщений: 47
04.11.2016, 12:09  [ТС] #9
Наиогромнейшее спасибо всем за помощь Информация была оооооочень полезна для меня )
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
04.11.2016, 12:22 #10
Цитата Сообщение от Киловат Посмотреть сообщение
Информация была оооооочень полезна для меня
Рад помочь!
0
04.11.2016, 12:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2016, 12:22
Привет! Вот еще темы с ответами:

Динамическое хранилище объектов - C++
Хочу написать динамическое хранилище объектов. Есть у меня два класса ListSections и Section. Section - простой класс, в нём храниться...

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

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

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


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

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

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