Russian Qt Forum

Qt => Общие вопросы => Тема начата: deaks от Ноябрь 26, 2010, 20:10



Название: удаление объектов из qvector
Отправлено: 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);


Название: Re: удаление объектов из qvector
Отправлено: Пантер от Ноябрь 26, 2010, 20:16
Учи плюсы. tagHosts->getArrHost() возвращает не сам объект, а его копию.


Название: Re: удаление объектов из qvector
Отправлено: eugene от Ноябрь 26, 2010, 20:43
QVector<CHost*> - массив указателей. Значит чтобы удалить нужно сделать delete tagHost и затем удалить его из списка ремувом. Вот только при вызове getArrHost вернется копия массива, и там, откуда его берет getTagHosts() он останется неизменным. Что может случится при обращении к несуществующему экземпляру все знают. Можно попробовать вернуть не сам массив а указатель на него.


Название: Re: удаление объектов из qvector
Отправлено: deaks от Ноябрь 26, 2010, 23:31
Значит чтобы удалить нужно сделать delete tagHost и затем удалить его из списка ремувом. Вот только при вызове getArrHost вернется копия массива, и там, откуда его берет getTagHosts() он останется неизменным. Что может случится при обращении к несуществующему экземпляру все знают. Можно попробовать вернуть не сам массив а указатель на него.

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

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


Название: Re: удаление объектов из qvector
Отправлено: Пантер от Ноябрь 26, 2010, 23:35
В tagHosts определи функцию вида:
Код
C++ (Qt)
void CHosts::removeHost (int index)
{
 ............
}
 


Название: Re: удаление объектов из qvector
Отправлено: deaks от Ноябрь 26, 2010, 23:45
да, именно так тоже делал, но результат примерно такой(удалял нулевой элемент):
для сравнения показываю нулевой и первый, после вызова функции удаления элемента из класса CHosts

(http://i047.radikal.ru/1011/5f/ffdbbb34ddbd.png)


Название: Re: удаление объектов из qvector
Отправлено: deaks от Ноябрь 27, 2010, 00:24
все, в порядке, разобрался!


Название: Re: удаление объектов из qvector
Отправлено: eugene от Ноябрь 27, 2010, 13:25

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

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

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


Название: Re: удаление объектов из qvector
Отправлено: Igors от Ноябрь 27, 2010, 14:07
Я наблюдаю 4 обращения tagHost->. поэтому не лучше ли сначала сделать этот кусок методом класса CHosts (тем более что он его модифицирует)? Вероятно после этого необходимость в ужасном getArrHost отпадет сама собой