Russian Qt Forum
Ноябрь 27, 2024, 02:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: удаление объектов из qvector  (Прочитано 7510 раз)
deaks
Гость
« : Ноябрь 26, 2010, 20:10 »

Здравствуйте,

как правильно удалять объекты из массива?так как в моем случае удаления не происходит. в том числе если использовать pop_функции
пример кода;
Код:
 
 CHosts *tagHosts = this->objHardware->getTagHosts();
    for(int i = 0, n = tagHosts->getCountHosts(); i < n; ++i)
    {
        CHost *tagHost = tagHosts->getArrHost().at(i);
        QString hostName = tagHost->getAbsName();
        if(!tmpStr.compare(hostName))
        {
            tagHosts->getArrHost().remove(i);
        }
    }

метод getArrHost возвращает массив QVector<CHost*>.
предварительно элементы в массив класс как
Код:
            CHost *tagHost = new CHost();
            m_arrHost.append(tagHost);
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 26, 2010, 20:16 »

Учи плюсы. tagHosts->getArrHost() возвращает не сам объект, а его копию.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
eugene
Гость
« Ответ #2 : Ноябрь 26, 2010, 20:43 »

QVector<CHost*> - массив указателей. Значит чтобы удалить нужно сделать delete tagHost и затем удалить его из списка ремувом. Вот только при вызове getArrHost вернется копия массива, и там, откуда его берет getTagHosts() он останется неизменным. Что может случится при обращении к несуществующему экземпляру все знают. Можно попробовать вернуть не сам массив а указатель на него.
Записан
deaks
Гость
« Ответ #3 : Ноябрь 26, 2010, 23:31 »

Значит чтобы удалить нужно сделать delete tagHost и затем удалить его из списка ремувом. Вот только при вызове getArrHost вернется копия массива, и там, откуда его берет getTagHosts() он останется неизменным. Что может случится при обращении к несуществующему экземпляру все знают. Можно попробовать вернуть не сам массив а указатель на него.

ну да, delete tagHost не выход.

а что нам даст указатель на массив?хм...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Ноябрь 26, 2010, 23:35 »

В tagHosts определи функцию вида:
Код
C++ (Qt)
void CHosts::removeHost (int index)
{
 ............
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
deaks
Гость
« Ответ #5 : Ноябрь 26, 2010, 23:45 »

да, именно так тоже делал, но результат примерно такой(удалял нулевой элемент):
для сравнения показываю нулевой и первый, после вызова функции удаления элемента из класса CHosts

Записан
deaks
Гость
« Ответ #6 : Ноябрь 27, 2010, 00:24 »

все, в порядке, разобрался!
Записан
eugene
Гость
« Ответ #7 : Ноябрь 27, 2010, 13:25 »


ну да, delete tagHost не выход.

а что нам даст указатель на массив?хм...

По этому указателю будет лежать нужный массив, а не его копия. Но это некошерно, лучше сделать как предложил Пантер.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 27, 2010, 14:07 »

Я наблюдаю 4 обращения tagHost->. поэтому не лучше ли сначала сделать этот кусок методом класса CHosts (тем более что он его модифицирует)? Вероятно после этого необходимость в ужасном getArrHost отпадет сама собой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.