![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: нет Всего: 2 |
тренируюсь "на кошечках" с std::vector. Что пытаюсь сделать:
GCC мне говорит, что ...main.h|83|error: base operand of `->' has non-pointer type `std::vector<Vertex*, std::allocator<Vertex*> ...дальше не видно Ясное дело, что я что-то не так делаю. А как надо? Я уже "программирование перебором" попробовал - что-то не выходит ![]() Я думал, что я создал вектор указателей и оператор [] мне вернет элемент вектора=указатель... Но.. --------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
Надо в строке 83 файла main.h в обрещении к методу или свойству обьекта поставить . , а не -> |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
comp объявлен как указатель на переменную типа Compound. а не на массив объктов Compound. соответственно comp[num]->coord2->x не имеет смысла, т.к. вы обращаетесь к элементу массива comp c индексом num. а т.к. массива нет - то вы просто выйдите за границы "массива" и запишите туда значения. Это сообщение отредактировал(а) zim22 - 7.7.2009, 19:15 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
код ужас, ошибок на порядок больше, чем строк в программе, при этом по большей степени ошибки не синтаксические (что можно было бы подправить), а логические.
вот Вам пример по работе с вектром : http://www.cplusplus.com/reference/stl/vector/push_back/ |
|||
|
||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: нет Всего: 2 |
Всем спасибо за ответы
Acer не в точке дело, к сожалению zim22 Извините, действительно гоню, во втором случае имелось в виду: while (1) { fscanf(fin, "%f %f %f", compounds[num]->coord2->x, compounds[num]->coord2->y, compounds[num]->coord2->z); ++num; //а тут я хочу обратиться к этим полуобъектам и "доинициализировать" их. Как это сделать? if (что-то) break; } mes спасибо за пример, сейчас посмотрю. з.ы. как-то нехорошо получилось. :( обычно проверяю то, что пишу. Добавлено через 9 минут и 20 секунд Собственно, надо было вчера на это забить, и наутро подумать головой :( Я сделал то, что хотел. Теперь интересует теория, за незнание которой я получил от mes'a поджопник. Наверно, я пока лучше сам поищу, что не найду - спрошу. ![]() --------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
Static |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: нет Всего: 2 |
Так-с... ну вот вопрос.
Объявляю вектор указателей на структуры:
Предположим, MyStruct имеет поля int a,b,c; Теперь, если я хочу присвоить значение полю а (например) в четвертом элемене вектора, мне приходится делать так:
Насколько это правильно? Мне не нравится внешний вид этих конструкций. Это сообщение отредактировал(а) Static - 9.7.2009, 09:28 --------------------
Я не настолько безнадежен, как кажется... |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
зачем вы вектор создаёте через new?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
![]() Также в Вашем случае лучше использовать вектор структур, а не вектор указателей.
и если в структуре есть указатели , то она должна иметь копи-конструктор (или пзаменить указатели на обычные переменные) |
|||
|
||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: нет Всего: 2 |
Спасибо за объяснение. Пошел учиться дальше.
--------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Вот тут я несогласен. Тема называется - "доступ в vector'е "сложных" объектов". Под сложным объектом может пониматься как объект имеющий мегабайтный объем, так и имеющий виртуальные методы. В первом случае мы имеем серьезное понижение производительности в случае частого использования вставки/удаления/добавления. Во втором вообще не реализуется. Поэтому вектор указателей юзать можно и местами нужно! Другое дело, что можно для этого использовать умные указатели. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Это да, смотря что называть сложными.. Мне кажется, что приведенная в коде структура уже достаточна сложна для соответствия темe. ![]() Но в любом случае (не смотря на название темы) прежде, чем заниматься "сложными", надо разобраться с "простыми" .. поэтому я и употребил словосочетание в цитате "в Вашем случае", которое основывается на приведенном автором коде: сложным, в упомянутом Вами значении, там и не пахнет ![]() к тому же сложилось ощущение, что автор "боится" использовать объекты не по указателю. ![]() Это сообщение отредактировал(а) mes - 10.7.2009, 12:44 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
... и использует scanf, где можно запросто обойтись cin >>
![]() |
|||
|
||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: нет Всего: 2 |
вот так бы сразу
![]() А то "ужас!", "ошибки!". Сразу надо было сказать, что именно не понравилось. 2mes Покажите, плз, где "многократное запихивание указателя на один и тот же объект". Если Вы про код в первом посте, то я там запарился, о чем ниже написал. Если я "неправильно исправился", ткните носом. 2bsa Можно чуть более развернуто про scanf vs cin? Я читаю данные из файла... использую fopen/fread/fseek etc. cin - это же потоки? Где-то читал, что мешать в одном коде два способа - плохо. Добавлено через 4 минуты и 4 секунды И, да, предполагалось, что "сложные объекты" - это тяжелые структуры, к полям которых и нужно обращаться. --------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Под coord1 тоже бы не помешало память выделить |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну так я не просто сказал "ужас", а дал ссылку на нормальный пример и документацию, в надежде что Вы сможете увидеть разницу и будет от чего отталкиваться.
посчитайте сколько раз у Вас new, а сколько push_back. В решении Вашей задачи их должно быть одинаково.. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |