Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> доступ в vector'е "сложных" объектов, operator [] 
V
    Опции темы
Static
Дата 7.7.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



тренируюсь "на кошечках" с std::vector. Что пытаюсь сделать:

Код

struct tri_mark
{
float x;
float y;
float z;
};

struct Compound
{
tri_mark *coord1;
tri_mark *coord2;
};
...
...
std::vector<Compound*> *compounds = new std::vector<Compound*>;
Compound *comp = new Compound;
int num = 0;

while (1)
        {
         fscanf(fin, "%f %f %f", &comp->coord1->x, &comp->coord1->y, &comp->coord1->z);
         compounds->push_back(comp);
         if (что-то) break;
//тут я хочу заполнить структуру coord1 прочитанными мз файла элементами и поместить в вектор такие "полуобъекты"
         }

while (1)
        {
         fscanf(fin, "%f %f %f", comp[num]->coord2->x, comp[num]->coord2->y, comp[num]->coord2->z);
         ++num;
//а тут я хочу обратиться к этим полуобъектам и "доинициализировать" их. Как это сделать?
         if (что-то) break;
         }


GCC мне говорит, что 
...main.h|83|error: base operand of `->' has non-pointer type `std::vector<Vertex*, std::allocator<Vertex*> ...дальше не видно

Ясное дело, что я что-то не так делаю. А как надо? Я уже "программирование перебором" попробовал - что-то не выходит smile
Я думал, что я создал вектор указателей и оператор [] мне вернет элемент вектора=указатель... Но..
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
Acer
Дата 7.7.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Цитата(Static @ 7.7.2009,  15:33)
GCC мне говорит, что 
...main.h|83|error: base operand of `->' has non-pointer type `std::vector<Vertex*, std::allocator<Vertex*> ...дальше не видно

Надо в строке 83 файла main.h в обрещении к методу или свойству обьекта поставить . , а не ->
PM MAIL   Вверх
zim22
Дата 7.7.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Код

Compound *comp = new Compound;
...
fscanf(fin, "%f %f %f", comp[num]->coord2->x, comp[num]->coord2->y, comp[num]->coord2->z);

comp объявлен как указатель на переменную типа Compound. а не на массив объктов Compound.
соответственно comp[num]->coord2->x не имеет смысла, т.к. вы обращаетесь к элементу массива comp c индексом num.
а т.к. массива нет - то вы просто выйдите за границы "массива" и запишите туда значения.



Это сообщение отредактировал(а) zim22 - 7.7.2009, 19:15


--------------------
PM MAIL   Вверх
mes
Дата 7.7.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



код ужас, ошибок  на порядок больше, чем строк в программе, при этом по большей степени ошибки не синтаксические (что можно было бы подправить), а логические.
вот Вам пример по работе с вектром : http://www.cplusplus.com/reference/stl/vector/push_back/




--------------------
PM MAIL WWW   Вверх
Static
Дата 8.7.2009, 08:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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 поджопник.
Наверно, я пока лучше сам поищу, что не найду - спрошу. smile
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
Static
Дата 9.7.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



Так-с... ну вот вопрос.

Объявляю вектор указателей на структуры:
Код

std::vector<MyStruct*> *vec_struct = new std::vector<MyStruct*>;


Предположим, MyStruct имеет поля int a,b,c;
Теперь, если я хочу присвоить значение полю а (например) в четвертом элемене вектора, мне приходится делать так:

Код

(*vec_struct)[3]->a = 666; //либо разыменовывать указатель
vec_struct->operator[](3)->a = 666//либо вызывать оператор [] через ->


Насколько это правильно? Мне не нравится внешний вид этих конструкций.

Это сообщение отредактировал(а) Static - 9.7.2009, 09:28
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
zim22
Дата 9.7.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Static @  9.7.2009,  09:27 Найти цитируемый пост)
Мне не нравится внешний вид этих конструкций.

Цитата(Static @  9.7.2009,  09:27 Найти цитируемый пост)
Объявляю вектор указателей на структуры

зачем вы вектор создаёте через new?
Код

std::vector<MyStruct*> vec_struct(4);
vec_struct[3]->a = 666;




--------------------
PM MAIL   Вверх
mes
Дата 9.7.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  9.7.2009,  08:36 Найти цитируемый пост)
зачем вы вектор создаёте через new?

 smile, Вы слишком сильно налегли на указатели. Вектор в принципе и создан для того чтоб отказаться от управления массивом через голый указатель
Также в  Вашем случае лучше использовать вектор структур, а не вектор указателей.
Код

std::vector<MyStruct> vec_struct;

и если в структуре есть указатели , то она должна иметь копи-конструктор (или пзаменить указатели на обычные переменные)


--------------------
PM MAIL WWW   Вверх
Static
Дата 9.7.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



Спасибо за объяснение. Пошел учиться дальше.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
bsa
Дата 10.7.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @ 9.7.2009,  10:07)
Также в  Вашем случае лучше использовать вектор структур, а не вектор указателей.

Вот тут я несогласен. Тема называется - "доступ в vector'е "сложных" объектов". Под сложным объектом может пониматься как объект имеющий мегабайтный объем, так и имеющий виртуальные методы. В первом случае мы имеем серьезное понижение производительности в случае частого использования вставки/удаления/добавления. Во втором вообще не реализуется. Поэтому вектор указателей юзать можно и местами нужно! Другое дело, что можно для этого использовать умные указатели.
PM   Вверх
mes
Дата 10.7.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(bsa @  10.7.2009,  09:36 Найти цитируемый пост)
Вот тут я несогласен

Это да, смотря что называть сложными.. Мне кажется, что приведенная в коде структура уже достаточна сложна для соответствия темe. smile

Но в любом случае (не смотря на название темы) прежде, чем заниматься "сложными", надо разобраться с "простыми" ..
 поэтому я и употребил словосочетание в цитате "в Вашем случае", которое основывается на приведенном автором коде:
 сложным, в упомянутом Вами значении, там и не пахнет smile, к тому же на лицо не понимание даже основ вектора, выражающееся хотя бы в многоразовом "запихивании" указателя на один и тот же(!) объект...
к тому же сложилось ощущение, что автор "боится" использовать объекты не по указателю.
smile

Это сообщение отредактировал(а) mes - 10.7.2009, 12:44


--------------------
PM MAIL WWW   Вверх
bsa
Дата 10.7.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



... и использует scanf, где можно запросто обойтись cin >> smile
PM   Вверх
Static
Дата 14.7.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



вот так бы сразу smile
А то "ужас!", "ошибки!". Сразу надо было сказать, что именно не понравилось.

2mes
Покажите, плз, где "многократное запихивание указателя на один и тот же объект". Если Вы про код в первом посте, то я там запарился, о чем ниже написал. Если я "неправильно исправился", ткните носом.

2bsa
Можно чуть более развернуто про scanf vs cin? Я читаю данные из файла... использую fopen/fread/fseek etc. cin - это же потоки? Где-то читал, что мешать в одном коде два способа - плохо.

Добавлено через 4 минуты и 4 секунды
И, да, предполагалось, что "сложные объекты" - это тяжелые структуры, к полям которых и нужно обращаться.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
ller
Дата 14.7.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Код

fscanf(fin, "%f %f %f", &comp->coord1->x, &comp->coord1->y, &comp->coord1->z);

Под coord1 тоже бы не помешало память выделить
PM MAIL   Вверх
mes
Дата 14.7.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Static @  14.7.2009,  09:06 Найти цитируемый пост)
А то "ужас!", "ошибки!". Сразу надо было сказать, что именно не понравилось.

ну так я не просто сказал "ужас", а дал ссылку на нормальный пример и документацию, в надежде что Вы сможете увидеть разницу
и будет от чего отталкиваться.

Цитата(Static @  14.7.2009,  09:06 Найти цитируемый пост)
Покажите, плз, где "многократное запихивание указателя на один и тот же объект".

посчитайте сколько раз у Вас new, а сколько push_back. В  решении Вашей задачи их должно быть одинаково..



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.