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

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

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

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

19.06.2014, 18:00. Просмотров 324. Ответов 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__ */
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2014, 18:00     Уточнение о полях структуры
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

Но вообще меня мучает именно вопрос, почему не видит после queue[i]. - оно должно видеть поля структуры, но ни фига.
alsav22
5416 / 4812 / 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
Сообщений: 219
20.06.2014, 01:07  [ТС]     Уточнение о полях структуры #9
Там написано для обычной очереди, для приоритетной я добавлял 2 параметр для приоритета.
Но проблема в том, что не видит поле структуры.
alsav22
5416 / 4812 / 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
Сообщений: 219
20.06.2014, 15:34  [ТС]     Уточнение о полях структуры #11
Дело в том, что проблема была не в компилляции, а в том, что в тех 2 местах почему-то не видны поля структуры.
Меня интересовал именно этот вопрос, а не работа программы в целом.
Ошибка только в хэдере, но какая - я не знаю.
alsav22
5416 / 4812 / 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     Уточнение о полях структуры
Еще ссылки по теме:

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

Уточнение о том как работает оператор for - C++
Я правильно понимаю? Оператор for, сперва будет работать только с первым выражением до тех пор, пока оно не станет ложным не переходя ко...

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

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

Шаблон в полях класса - C++
Есть шаблон класса Model который в качестве аргумента шаблона принимает разные типы контейнеров. Класс MainClass с помощью метода...


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

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

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