TheLostJedi Ответов: 1

Могу ли я использовать одну и ту же переменную для инициализации двух объектов класса?


Я должен создавать и инициализировать объекты класса под названием Device в моей основной программе. Но количество создаваемых объектов зависит от ввода данных пользователем. IDE-это Qt, поэтому у меня есть доступ к таким структурам данных, как QListс.

Что я уже пробовал:

Моя идея состояла в том, что в заголовочном файле я бы объявил указатель устройства следующим образом
Device* temp; QList<Device*>myList;
затем в исходном файле я инициализировал бы это в цикле for на основе количества входных данных. Вот так:
for(int i = 0; i<inputVal; i++){
     temp = new Device;
     myList.append(temp);
}


Я еще не могу запустить код, так как он является частью большего модуля, поэтому я хотел бы знать, является ли это полностью неправильным с теоретической точки зрения. Я надеялся, что смогу повторно использовать имя переменной temp и в конце концов ... , temp будет содержать указатель на последний созданный объект устройства, и для очистки памяти я бы использовал foreach петля На QList.

Пожалуйста, совет!!

1 Ответов

Рейтинг:
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();
}


CPallini

5.

TheLostJedi

Это именно то, что я искал! И даже больше! Вопрос: если один из Device объекты разрушаются, что же будет с ними дальше? QList член клуба? Станет ли он нулевым указателем? У меня есть уникальный идентификатор для каждого из этих объектов, я думал об использовании QMap<int,Device*> и сигнал в деструкторе этого Device класс, так что я могу удалить член, если он будет уничтожен во время выполнения.

Jochen Arndt

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

Обратите внимание, что делают takeFirst() и takeLast (): они вернут указатель, но удалят первый/последний элемент из списка (поэтому мне пришлось исправить свой ответ относительно доступа к последнему элементу).

Воспользуйся

delete takeAt(ndx);

чтобы сделать то же самое для устройства по индексу или removeAt (), чтобы удалить элементы из списка, где устройство уже было удалено.

Если вы не знаете индекс устройства, которое уже было удалено, повторите элементы списка, пока не найдете указатель и не удалите этот элемент.

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

Это позволяет избежать использования сигнала. Если вам действительно нужен сигнал (не можете вызвать функцию удаления напрямую) Я бы выбрал сигнал, который запускает удаление.