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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача указатель на вектор в объект ? 
:(
    Опции темы
Remiznik
Дата 13.5.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть пару вопросов по копированию сложного объекта. 
Код

#include "Object.h" // определение  объекта 
#include <vector>

   vector<Object*> vec_obj; //вектор  указателей на объект 

class B{
   vector<Object*>* pVec;  // указатель на вектор с объектами 
public:
   B( vector<Object*>* ppVec){ ppVec=pVec; } // в конструктор класса В передается указатель на вектор 
// какие то методы для работы с указателем 
}

int main()
{
      //создается и заполняется вектор vec_obj     
      B* b=new B( &veco_obj ); // создается класс В и передается указатель на вектор 
     // какие то манипуляции с классом В 
    delete b;
    // продолжаю работать с vec_obj
    return 0;
}


Object сложный объект  содержит и указатели и массивы. 
Смысл задуманного создать класс В для манипуляции с вектором объектов передать туда указатель на вектор. И после удаления объекта чтоб все изменения в vec_obj остались.

Вопросы.
1 Правильно ли передавать указатель на вектор в объект ? 
2 Правильно это реализовано ? 
3 После удаления объекта b не будет ли утечки памяти ? 
PM MAIL   Вверх
mes
Дата 13.5.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Remiznik @  13.5.2010,  18:58 Найти цитируемый пост)
1 Правильно ли передавать указатель на вектор в объект ? 

зависит от семантики задачи.. вполне возможно что справедливо и для Вашей задачи..

Цитата(Remiznik @  13.5.2010,  18:58 Найти цитируемый пост)
2 Правильно это реализовано ? 

боюсь тут другое неправильно организовано, а именно хранение объектов в вкторе по указателю...
подобный подход требует некоторых гарантий, то бишь ограничений на работу с вектором, чего, судя по заданным вопросам, не соблюдается...

Цитата(Remiznik @  13.5.2010,  18:58 Найти цитируемый пост)
3 После удаления объекта b не будет ли утечки памяти ?  

в показанной части примера - нет, не будет.


Это сообщение отредактировал(а) mes - 13.5.2010, 20:09


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


Опытный
**


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

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



А что за ограничения на работу с вектором с указателями ? 

меня слушает то что в строке 9 происходит  присвоение копированием а если объект  сложный то могут возникнуть трудности.
PM MAIL   Вверх
mes
Дата 13.5.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Remiznik @  13.5.2010,  20:58 Найти цитируемый пост)
А что за ограничения на работу с вектором с указателями ? 

ну все что исходит из хранения по указателю, и в частности например, при удалении или ресайзе вектора объекты не будут удалены.

Цитата(Remiznik @  13.5.2010,  20:58 Найти цитируемый пост)
меня слушает то что в строке 9 происходит  присвоение копированием а если объект  сложный то могут возникнуть трудности. 

посмотрите внимание, что там копируется... указатель smile а указатель "не может быть" сложным объектом smile




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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  13.5.2010,  20:08 Найти цитируемый пост)
боюсь тут другое неправильно организовано, а именно хранение объектов в вкторе по указателю...подобный подход требует некоторых гарантий, то бишь ограничений на работу с вектором

а о каких ограничениях вы говорите ? Ведь если бы у автора был бы вектор объектов, а не указателей, вот тогда могли бы возникнуть проблемы, т.к.
Цитата(Remiznik @  13.5.2010,  19:58 Найти цитируемый пост)
Object сложный объект  содержит и указатели и массивы. 




Remiznik, вообще-то это - дело вкуса, но красивее было бы хранить ссылку на вектор. Хотя, повторяю, это - дело вкуса:
Код

class B{
   vector<Object*> & rVec;  // ссылка на вектор с объектами 
public:
   B( vector<Object*>& v) : rVec( v ) {} // в конструктор класса В передается ссылка на вектор 
// какие то методы для работы с ссылкой 
}

int main()
{
      //создается и заполняется вектор vec_obj     
      B* b=new B( veco_obj ); // создается класс В и передается ссылка на вектор 
...



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 13.5.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(borisbn @  13.5.2010,  21:09 Найти цитируемый пост)
а о каких ограничениях вы говорите ?

на подобное использование :
Код

vec.push_back(new Object);
vec.clear ();


Цитата(borisbn @  13.5.2010,  21:09 Найти цитируемый пост)
Ведь если бы у автора был бы вектор объектов, а не указателей, вот тогда могли бы возникнуть проблемы,

 это уже проблемы не вектора, а класса... 

Цитата(borisbn @  13.5.2010,  21:09 Найти цитируемый пост)
о красивее было бы хранить ссылку на вектор. 

не только вкуса, но и задачи.. в том случае, если аргумент "может не быть" (т.е. может быть нулем).
smile




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


Эксперт
****


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

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



Remiznik, почитай про умные указатели (boost::shared_ptr) и используй вместо обычных. В этом случае проблем с утечками не будет.
PM   Вверх
GoldFinch
Дата 14.5.2010, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 6
Всего: 26



еще можно хранить элементы гденить в списке по значению, а в векторе - хранить итераторы на элементы этого списка
PM MAIL ICQ   Вверх
Remiznik
Дата 19.5.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mes, про то что clear() не удаляет объекты я знаю потому удаляю их так 
Код

for( int i=0; i<vec.size(); i++){
     delete vec.at(i);
}
vec.clear();



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

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

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

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

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


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

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


 




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


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

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