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

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

Войти
Регистрация
Восстановить пароль
 
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Хранение в векторе объектов своего класса - C++

15.05.2012, 19:10. Просмотров 801. Ответов 0
Метки нет (Все метки)

В общем-то проблема. Задачей является хранение пар ключ-значение в векторе. Значение в данном случае строка char*. Если ключ повторяется то хранятся оба значения с разными версиями.
Проблемы:
1)minigw валится с этим проектом с самого начала. Где валится - фиг поймёшь, пошагово дебагером доходишь до конца - оно работает хорошо и корректно. Тот же профиль для дебага запускаешь на выполнение до конца (без точек остановки) - вываливается. Такое ощущение что оно дразнится.
2)В vs всё работает хорошо, кроме одного единственного освобождения памяти. Комментарием отметил.
Что может быть не так? Конструкторы копирования для вектора написаны, деструкторы тоже.
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <iostream>
#include <iomanip>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
using namespace std;
 
 
struct Item
{
    Item(int rel, char* info, Item* nex=0)
    :release(rel), string(new char[strlen(info)]+1), next(nex)
    {
        strcpy(string,info);
    }
 
    Item(const Item& right)
    {
        Item* temp= &const_cast<Item&>(right);
        Item* toAdd=this;
        while(temp)
        {
            toAdd->release=temp->release;
            toAdd->string= new char[strlen(temp->string)+1];
            strcpy(toAdd->string,temp->string);
            temp=temp->next;
        }
        toAdd->next=NULL;
    }
 
    int release;//номер версии
    char* string;//строка символов
    Item* next;//указатель на следующий элемент
 
    friend ostream& operator<<(ostream& os, const Item& right)
    {
        Item* temp= &const_cast<Item&>(right);
        while(temp)
         os<<"\t"<<"v."<<temp->release<<" -> "<<temp->string<<"\n",temp=temp->next;
        return os;
    }
 
    ~Item()
    {
        delete []string;
    }
};
 
struct Node
{
    Node(){}
    Node(int k, Item* inf)
    :key(k), info(inf) {}
    Node(const Node& right)
    {
        key=right.key;
        info=new Item(*(right.info));
    }
 
    int key;
    Item* info;
};
 
class Table
{
public:
    Table(int sz)//sz= ограничение размер вектора
    :size(sz)
    {
        vec.resize(0);
    }
 
    void Add(int key, char* info)
    {
        if(!Belong(key))
        {
            Item* item=new Item(1,info,NULL);
            vec.push_back(Node(key,item));
        }
        else
        {
            int version(1);
            Item* item=new Item(1,info,NULL);
            vector<Node>::iterator it=vec.begin();
            while(it->key!=key)
                it++;
            Item* pos=it->info;
            while(pos->next)
            {
                pos=pos->next;
                version=pos->release;
            }
            pos->next= new Item(++version,info,NULL);
            
        }
    }
 
    void Delete(int key, int version=-1)
    {
        if(!Belong(key))
            cerr<<"Can't find element with key = "<<key<<"\n";
        else
        {
            vector<Node>::iterator it=vec.begin();
            while(it->key!=key)
                it++;
            if(version==-1 || !(it->info->next))
                vec.erase(it);
            else
            {
                Item* pos=it->info;
                Item* toDel;
                while(pos && pos->release!=version)
                    pos=pos->next;
                toDel=pos;
                if(!toDel)
                {
                    cerr<<"Can't find element with key = "<<key<<" and version = "<<version<<"\n";
                    return;
                }
                else if(toDel==it->info)
                {
                    it->info=toDel->next;
                    delete toDel;//не вываливается в VS
                    return;
                }
                else
                {
                    Item* temp=it->info;
                    while(temp->next!=toDel)
                        temp=temp->next;
                    temp->next=temp->next->next;
                    //вываливается в VS. Ошибка - BLOCK_TYPE_IS_VALID
                    delete toDel;
                    return;
                }
            }
        }
    }
 
 
    bool Belong(int key)
    {
        if(!vec.size())
         return false;
        vector<Node>::iterator it=vec.begin();
        while(it!=vec.end() && it->key!=key)
         it++;
 
        return (it!=vec.end() ? true : false);
    }
 
    friend ostream& operator<<(ostream& os, const Table& print)
    {
        vector<Node>::const_iterator it= print.vec.begin();
        while(it!=print.vec.end())
         os<<it->key<<*(it->info),it++;
        return os;
    }
 
 
 
private:
    vector <Node> vec;
    int size;
};
 
 
int main()
{
    Table t(10);
    t.Add(2,"string");
    t.Add(3,"stringg");
    t.Add(2,"second string");
    t.Add(3,"third string");
    t.Add(2,"fourth string");
    t.Delete(2,2);
    cout<<t;
}
Добавлено через 1 минуту
Ошибка кстати очень странная при дебаге в VS - "BLOCK_TYPE_IS_VALID". Именно VALID.

Добавлено через 44 минуты
Нашёл что у меня там конструктор копирования в одном месте криво написан, правда работе программы это не помогло. Вот с таким конструктором копирования должна быть структура Item
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
struct Item
{
    Item(int rel=0, char* info="", Item* nex=0)
    :release(rel), string(new char[strlen(info)]+1), next(nex)
    {
        strcpy(string,info);
    }
 
    Item(const Item& right)
    {
        Item* temp= &const_cast<Item&>(right);
        Item* toAdd=this;
        while(temp)
        {
            toAdd->release=temp->release;
            toAdd->string= new char[strlen(temp->string)+1];
            strcpy(toAdd->string,temp->string);
            temp=temp->next;
            if (temp)
                toAdd=(toAdd->next=new Item);
        }
        toAdd->next=NULL;
    }
 
    int release;//номер версии
    char* string;//строка символов
    Item* next;//указатель на следующий элемент
 
    friend ostream& operator<<(ostream& os, const Item& right)
    {
        Item* temp= &const_cast<Item&>(right);
        while(temp)
         os<<"\t"<<"v."<<temp->release<<" -> "<<temp->string<<"\n",temp=temp->next;
        return os;
    }
 
    ~Item()
    {
        delete []string;
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 19:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранение в векторе объектов своего класса (C++):

Хранение объектов в векторе - C++
У меня есть класс, экземпляр которого не может быть изменён нигде кроме конструктора и деструктора. Так же запрещено его копирование....

Хранение в list объектов класса - C++
Пусть дан класс, содержащий два поля: ФИО и возраст. Методы ввода и вывода ФИО и возраста. Как использовать шаблонный класс list для...

Как в векторе объектов пользовательского класса изменить заданное поле у определённого элемента? - C++
Добрый день. Создан вектор из структры: struct man { char name; int age; man(void) {} man(const...

Использование универсальной инициализации для объектов своего класса - C++
Здравствуйте! Все мы знаем, что поля структуры мы можем красиво инициализировать через {...}. Тогда мы std::vector структур можем...

Использование своего объекта своего класса внутри другого - C++
Здравствуйте. Есть класс для работы с матрицами. Все работает. Теперь нужно создать другой класс, где полями будут являться переменные -...

Как получить доступ к методам класса, который содержится в векторе класса - C++
Пишу дерево с любым количеством наследников. В классе Thread содержится вектор классов Thread. При попытке просмотра первого элемента в...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 19:10
Привет! Вот еще темы с ответами:

Сортировка объектов в векторе - C++
Есть код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;functional&gt; #include &lt;vector&gt; #include &lt;random&gt; #include...

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

Вызов деструктора для класса в векторе - C++
Уважаемые знатоки, подскажите по-поводу деструктора класса, а то я совсем запутался вот в такой ситуации: - есть класс - Ship; - от...

Хранение объектов - что оптимальнее? - C++
Доброго времени суток, товарищи. Пишу простенькую РПГ. Имеется карта тайлов - массив вида map. На уровне также есть ≈25 персонажей и ≈50...


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

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

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