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

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

Войти
Регистрация
Восстановить пароль
 
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
#1

Уточнение о полях структуры - C++

19.06.2014, 18:00. Просмотров 336. Ответов 12
Метки нет (Все метки)

Подскажите, пожалуйста, почему у меня не видны поля структуры ? Мне кажется, я где-то неправильно обращаюсь к структуре, но не знаю, как правильно сделать.
В коде эти 2 места обозначены комментарием.
Если вдруг для ответа нужен класс Вектор, на основе которого делалась очередь, то его тоже прикрепляю.

PriorityQueue.h
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
 
#pragma once
#include "SmartVector.h"
 
template <class T>
struct PriorityQueueItem
{
    T item;
    int priority;
};
 
template <class T>
class PriorityQueue
{
private:
    SmartVector<PriorityQueueItem<T> > queue;
public:
    PriorityQueue(){}
 
    bool IsEmpty() const { return queue.IsEmpty(); }
 
    void Add(const T& value, int priority);
    T Extract();
 
    uint GetCount() const { return queue.GetCount(); }
};
 
template <class T>
void PriorityQueue<T>::Add(const T& value, int priority)
{
    int index = queue.GetCount();
    for (int i = 0; i < queue.GetCount(); i++)
    {
        if (queue[i].priority < priority) // почему после queue[i]. уже не видит priority
        {
            index = i;
            break;
        }
    }
    PriorityQueueItem<T> p = {value, priority};
    queue.Insert(index, p);
}
 
template <class T>
T PriorityQueue<T>::Extract()
{
    if (queue.IsEmpty())
        throw "queue is empty";
    else
    {
        T value = queue[0].item; // почему после queue[0]. уже не видит item
        queue.Remove(0);
        return value;
    }
}
SmartVector.h

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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#ifndef __SMARTVECTOR_H__
#define __SMARTVECTOR_H__
 
typedef unsigned int uint;
 
template <class T>
class SmartVector
{
private:
    // Размер блока памяти для начального выделения памяти.
    // Методы Add и Insert используют эту константу для
    // начального выделения памяти, если массив пуст.
    // Конструкторы не используют эту константу, а используют
    // указанное при их вызове количество элементов.
    enum { block_size = 16 };
 
    T *data;
    uint count;
    uint capacity;
 
    bool IsFull() const { return count == capacity; }
public:
    // Конструкторы
    SmartVector() : data(0), count(0), capacity(0) {}
    explicit SmartVector(uint initCount);
    SmartVector(const SmartVector<T>& v);
    SmartVector(T array[], uint arraySize);
    // Деструктор
    ~SmartVector() { Clear(); }
 
    // Очистка вектора
    void Clear();
 
    // Присваивание
    SmartVector& operator=(const SmartVector<T>& v);
 
    // Работа с размером вектора
    uint GetCount() const { return count; }
    bool IsEmpty() const { return count == 0; }
    bool operator!() const { return IsEmpty(); }
 
    // Доступ к элементам
    T& operator[](uint index);
    const T& operator[](uint index) const;
 
    // Добавление и удаление элементов
    void Add(const T& item);
    void Insert(uint index, const T& item);
    void Remove(uint index);
};
 
template <class T>
SmartVector<T>::SmartVector(uint initCount)
{
    if (!initCount)
        data = 0;
    else
        data = new T[initCount];
    count = capacity = initCount;
}
 
template <class T>
SmartVector<T>::SmartVector(const SmartVector<T>& v)
{
    if (!v.count)
        data = 0;
    else
    {
        // Выделяем память и копируем элементы
        data = new T[v.count];
        for (uint i = 0; i < v.count; i++)
            data[i] = v.data[i];
    }
    count = capacity = v.count;
}
 
template <class T>
SmartVector<T>::SmartVector(T array[], uint arraySize)
{
    if (!arraySize)
        data = 0;
    else
    {
        // Выделяем память и копируем элементы
        data = new T[arraySize];
        for (uint i = 0; i < arraySize; i++)
            data[i] = array[i];
    }
    count = capacity = arraySize;
}
 
template <class T>
void SmartVector<T>::Clear()
{
    if (count)
    {
        delete[] data;
        data = 0;
        count = capacity = 0;
    }
}
 
template <class T>
SmartVector<T>& SmartVector<T>::operator=(const SmartVector<T>& v)
{
    // Проверка на самоприсваивание
    if (this == &v) return *this;
 
    if (!v.count)
    {
        delete[] data;
        data = 0;
    }
    else
    {
        // Выделяем память и копируем элементы
        T *temp = new T[v.count];
        for (uint i = 0; i < v.count; i++)
            temp[i] = v.data[i];
        // Удаляем старый массив
        delete[] data;
        data = temp;
    }
    count = capacity = v.count;
 
    return *this;
}
 
template <class T>
T& SmartVector<T>::operator[](uint index)
{
    if (index >= count)
        throw "SmartVector<T>::operator[](uint index): Out of bounds!";
 
    return data[index];
}
 
template <class T>
const T& SmartVector<T>::operator[](uint index) const
{
    if (index >= count)
        throw "SmartVector<T>::operator[](uint index) const: Out of bounds!";
 
    return data[index];
}
 
template <class T>
void SmartVector<T>::Add(const T& item)
{
    if (!count)
    {
        data = new T[block_size];
        capacity = block_size;
        *data = item;
    }
    else
    {
        if (IsFull())
        {
            // Увеличиваем массив в 2 раза
            uint newcapacity = capacity * 2;
            // Выделяем память и копируем элементы
            T *temp = new T[newcapacity];
            for (uint i = 0; i < count; i++)
                temp[i] = data[i];
            // Добавляем новый элемент
            temp[count] = item;
            // Удаляем старый массив
            delete[] data;
            data = temp;
            capacity = newcapacity;
        }
        else
            data[count] = item;
    }
    count++;
}
 
template <class T>
void SmartVector<T>::Insert(uint index, const T& item)
{
    if (index > count)
        throw "SmartVector<T>::Insert(uint index, const T& item): Out of bounds!";
 
    if (!count)
    {
        data = new T[block_size];
        capacity = block_size;
        *data = item;
    }
    else
    {
        if (IsFull())
        {
            // Увеличиваем массив в полтора раза
            uint newcapacity = capacity * 2;
            // Выделяем память и копируем элементы
            T *temp = new T[newcapacity];
            for (uint i = 0; i < count; i++)
                if (i < index)
                    temp[i] = data[i];
                else if (i >= index)
                    temp[i + 1] = data[i];
            // Вставляем новый элемент
            temp[index] = item;
            // Удаляем старый массив
            delete[] data;
            data = temp;
            capacity = newcapacity;
        }
        else
        {
            for (uint i = count - 1; i >= index; i--)
                data[i + 1] = data[i];
            data[index] = item;
        }
    }
    count++;
}
 
template <class T>
void SmartVector<T>::Remove(uint index)
{
    if (index >= count)
        throw "SmartVector<T>::Remove(uint index): Out of bounds!";
 
    if (count == 1)
    {
        delete[] data;
        data = 0;
        capacity = 0;
    }
    else
    {
        for (uint i = index + 1; i < count; i++)
            data[i - 1] = data[i];
    }
    count--;
}
 
#endif /* __SMARTVECTOR_H__ */
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2014, 18:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Уточнение о полях структуры (C++):

Помещение структуры в вектор, удаление структуры, изменение элементов структуры - C++
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный элемент структуры. 2 - удалять...

Уточнение по С++11 - C++
Читаю Страуструпа по С++11. Там приведены 2 примера, которые я хочу уточнить. class X2 { X2&amp; operator=(const X2&amp;) =...

Небольшое уточнение - C++
Дан массив. в нем выполняется поиск элемента последовательным или бинарным методами (в зависимости от заданных параметров). вот код полной...

Уточнение по коду - C++
Что возвращает эта строка, если массивы double значений: s = s | s]; Добавлено через 1 час 8 минут Я прошу это уже 3 дня, что,...

уточнение по Объеденениям - C++
Прочитал на http://programmersclub.ru/19/, что Объединения хранят инфу только для одного элемента в данный момент времени, но зделав один...

Абстрактный класс, уточнение - C++
Йеп. Интересует вот что: Нужно создать абстрактный класс Издание, где будет хранится название и цена книги. Наследуются класс -- Книги,...

12
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2014, 20:17 #2
Как очередь создаёте?
0
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
19.06.2014, 20:51  [ТС] #3
Ну очередь с приоритетом;
я не могу понять, почему не видны поля струтуры ( нажимаю точку и не появляется окошко, чтобы выбрать поля структуры: item и priority.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2014, 21:29 #4
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Ну очередь с приоритетом;
Цитата Сообщение от alsav22 Посмотреть сообщение
Как очередь создаёте?
Покажите, что в main() делаете.

Добавлено через 28 минут
Цитата Сообщение от Spiderman5 Посмотреть сообщение
нажимаю точку и не появляется окошко, чтобы выбрать поля структуры: item и priority
Потому, что PriorityQueueItem<T> шаблон. Сделайте так, и будет появляться:
C++
1
SmartVector<PriorityQueueItem<int> > queue;
0
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
19.06.2014, 21:30  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "priorityQueue.h"
using namespace std;
 
void main()
{
    PriorityQueue<double> p;
    p.Add(1.5);
    p.Add(3.6);
    p.Add(1.1);
    cout << p.Extract() << endl;
    cout << p.Extract() << endl;
    cout << p.Extract() << endl;
}
Оно не срабатывает из-за того, что в хэдере не видит поля структуры.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2014, 21:50 #6
Вот это компилируется?
Цитата Сообщение от Spiderman5 Посмотреть сообщение
p.Add(1.5);
p.Add(3.6);
p.Add(1.1);
Добавлено через 6 минут
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Оно не срабатывает из-за того, что в хэдере не видит поля структуры.
Не срабатывает (имеется ввиду, цикл for() в Add) из-за того, что конструктор по умолчанию используется, поэтому все поля в queue нулевые.
0
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
19.06.2014, 22:42  [ТС] #7
Компиллирует и падает.

Так что мне тогда сделать ?

Но вообще меня мучает именно вопрос, почему не видит после queue[i]. - оно должно видеть поля структуры, но ни фига.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2014, 22:49 #8
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Компиллирует
Как это? Вот Add():
C++
1
void PriorityQueue<T>::Add(const T& value, int priority);
Принимает два параметра. Вызываете так:
C++
1
p.Add(1.5);
И это компилируется?
0
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
20.06.2014, 01:07  [ТС] #9
Там написано для обычной очереди, для приоритетной я добавлял 2 параметр для приоритета.
Но проблема в том, что не видит поле структуры.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2014, 01:12 #10
Цитата Сообщение от Spiderman5 Посмотреть сообщение
для приоритетной я добавлял 2 параметр для приоритета.
Тут создаётся очередь с приоритетом? Priority подсказывает, что да.
Цитата Сообщение от Spiderman5 Посмотреть сообщение
PriorityQueue<double> p;
Тогда о чём пишите?
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Там написано для обычной очереди,
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Но проблема в том, что не видит поле структуры.
Проблема в том, что не нужно коды, которые не компилируются выкладывать, и ждать, после этого, что у кого-то появится желание разбираться в них.
0
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
20.06.2014, 15:34  [ТС] #11
Дело в том, что проблема была не в компилляции, а в том, что в тех 2 местах почему-то не видны поля структуры.
Меня интересовал именно этот вопрос, а не работа программы в целом.
Ошибка только в хэдере, но какая - я не знаю.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2014, 19:43 #12
Цитата Сообщение от Spiderman5 Посмотреть сообщение
а в том, что в тех 2 местах почему-то не видны поля структуры.
Меня интересовал именно этот вопрос
4 пост (это про студию). В Code Blocks уже видны (скрин).
0
Миниатюры
Уточнение о полях структуры  
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
21.06.2014, 13:08  [ТС] #13
Да, спасибо ! Я еще вчера проверял работу программы - и она работала, и препод сказал, что единственной проверкой является компиляция в данном моменте, а студия просто не показывает, что можно выбрать эти поля.
0
21.06.2014, 13:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2014, 13:08
Привет! Вот еще темы с ответами:

Уточнение корня уравнения - C++
Условие к программе: Уточнение корня уравнения sin^2*x+a*sin*x-b=0

Уточнение как работает getchar(); - C++
Я ввёл 4 символа в оператор getchar(); и нажал &lt;Enter&gt;. Количество введённый символов получается 5? В смысле &lt;Enter&gt; это же символ...

Уточнение о геттере в классе Строка - C++
Подскажите, пожалуйста, как правильно должен быть реализован такой геттер ? class String { private: char* str; int length; ...

Уточнение корня методом простой итерации - C++
Ув. форумчане, помогите пожалуйста разобраться с методом простой итерации. Не пойму, в чем ошибка. То ли в условии продолжения цикла, то ли...


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

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

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