Рейтинг:
10
Jochen Arndt
Вы можете это сделать, но это плохой стиль. Временная переменная должна быть локальной, а не членом класса:
for (int i = 0; i < inputVal; i++)
{
Device *temp = new Device;
myList.append(temp);
}
Нет даже необходимости использовать временную переменную:
for (int i = 0; i < inputVal; i++)
{
myList.append(new Device());
}
Чтобы получить доступ к последнему пункту просто позвоните
myList.takeLast()
myList.last()
.
Функция очистки должна вызываться из деструктора класса, которому принадлежит
myList
и может быть вызван из другого места, если потребуется:
MyClass::~MyClass()
{
// Other cleanup here
DeleteAllDevices();
}
void MyClass::DeleteAllDevices()
{
while (!myList.isEmpty())
delete myList.takeFirst();
}
TheLostJedi
Это именно то, что я искал! И даже больше! Вопрос: если один из Device
объекты разрушаются, что же будет с ними дальше? QList
член клуба? Станет ли он нулевым указателем? У меня есть уникальный идентификатор для каждого из этих объектов, я думал об использовании QMap<int,Device*>
и сигнал в деструкторе этого Device
класс, так что я могу удалить член, если он будет уничтожен во время выполнения.
Jochen Arndt
Если вы удаляете устройство, вы должны удалить этот элемент также из списка, потому что
тогда недопустимый указатель все еще будет там.
Обратите внимание, что делают takeFirst() и takeLast (): они вернут указатель, но удалят первый/последний элемент из списка (поэтому мне пришлось исправить свой ответ относительно доступа к последнему элементу).
Воспользуйся
delete takeAt(ndx);
чтобы сделать то же самое для устройства по индексу или removeAt (), чтобы удалить элементы из списка, где устройство уже было удалено.
Если вы не знаете индекс устройства, которое уже было удалено, повторите элементы списка, пока не найдете указатель и не удалите этот элемент.
Я предлагаю управлять устройствами в одном месте, где класс, содержащий список, был бы лучшим местом. Предоставьте функцию для удаления устройства путем передачи указателя или идентификатора, который затем выполняет поиск в списке.
Это позволяет избежать использования сигнала. Если вам действительно нужен сигнал (не можете вызвать функцию удаления напрямую) Я бы выбрал сигнал, который запускает удаление.