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

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

Восстановить пароль Регистрация
 
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
19.06.2014, 18:00     Уточнение о полях структуры #1
Подскажите, пожалуйста, почему у меня не видны поля структуры ? Мне кажется, я где-то неправильно обращаюсь к структуре, но не знаю, как правильно сделать.
В коде эти 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__ */
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2014, 20:17     Уточнение о полях структуры #2
Как очередь создаёте?
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
19.06.2014, 20:51  [ТС]     Уточнение о полях структуры #3
Ну очередь с приоритетом;
я не могу понять, почему не видны поля струтуры ( нажимаю точку и не появляется окошко, чтобы выбрать поля структуры: item и priority.
alsav22
5282 / 4801 / 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;
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
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;
}
Оно не срабатывает из-за того, что в хэдере не видит поля структуры.
alsav22
5282 / 4801 / 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 нулевые.
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
19.06.2014, 22:42  [ТС]     Уточнение о полях структуры #7
Компиллирует и падает.

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

Но вообще меня мучает именно вопрос, почему не видит после queue[i]. - оно должно видеть поля структуры, но ни фига.
alsav22
5282 / 4801 / 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);
И это компилируется?
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
20.06.2014, 01:07  [ТС]     Уточнение о полях структуры #9
Там написано для обычной очереди, для приоритетной я добавлял 2 параметр для приоритета.
Но проблема в том, что не видит поле структуры.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2014, 01:12     Уточнение о полях структуры #10
Цитата Сообщение от Spiderman5 Посмотреть сообщение
для приоритетной я добавлял 2 параметр для приоритета.
Тут создаётся очередь с приоритетом? Priority подсказывает, что да.
Цитата Сообщение от Spiderman5 Посмотреть сообщение
PriorityQueue<double> p;
Тогда о чём пишите?
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Там написано для обычной очереди,
Цитата Сообщение от Spiderman5 Посмотреть сообщение
Но проблема в том, что не видит поле структуры.
Проблема в том, что не нужно коды, которые не компилируются выкладывать, и ждать, после этого, что у кого-то появится желание разбираться в них.
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
20.06.2014, 15:34  [ТС]     Уточнение о полях структуры #11
Дело в том, что проблема была не в компилляции, а в том, что в тех 2 местах почему-то не видны поля структуры.
Меня интересовал именно этот вопрос, а не работа программы в целом.
Ошибка только в хэдере, но какая - я не знаю.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2014, 19:43     Уточнение о полях структуры #12
Цитата Сообщение от Spiderman5 Посмотреть сообщение
а в том, что в тех 2 местах почему-то не видны поля структуры.
Меня интересовал именно этот вопрос
4 пост (это про студию). В Code Blocks уже видны (скрин).
Миниатюры
Уточнение о полях структуры  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2014, 13:08     Уточнение о полях структуры
Еще ссылки по теме:

C++ Уточнение по С++11
Уточнение корня методом простой итерации C++
Уточнение корня уравнения C++

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

Или воспользуйтесь поиском по форуму:
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
21.06.2014, 13:08  [ТС]     Уточнение о полях структуры #13
Да, спасибо ! Я еще вчера проверял работу программы - и она работала, и препод сказал, что единственной проверкой является компиляция в данном моменте, а студия просто не показывает, что можно выбрать эти поля.
Yandex
Объявления
21.06.2014, 13:08     Уточнение о полях структуры
Ответ Создать тему
Опции темы

Текущее время: 05:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru