Класс TaskGroup
в основном содержит список Task
s. Я хочу собрать определенные задачи ta1
, ta2
, tb3
… из разных групп ga
, gb
, gc
, … и использовать этот список в окне отображения / классе. Выбор задач для коллекции не имеет значения для этого вопроса.
(Поскольку вопрос скорее концептуальный, чем технический, примеры в основном псевдокода. Поскольку я использую Qt в этом конкретном случае, я буду использовать классы Qt, но вопрос не должен ограничиваться этим случаем.)
class Task;
class TaskGroup {
QString name;
QList<Task> tasklist;
...
}
Объекты из текста выше, ta1
и т.д., следует понимать как «первое задание из группы ga
» так далее.
Теперь это не будет проблемой:
QList<Task> collection;
collection.append(ga.getTask(1));
...
collection.append(gb.getTask(3));
...
doSomethingWithTheCollection(collection);
Вариант использования — это что-то вроде: «создать задачи, организованные в списках -> выбрать определенные задачи -> добавить их в список TO TO (коллекция) -> отобразить коллекцию -> выполнить задачи -> удалить выполненную задачу из коллекции« И » его первоначальный список по одному -> повторить «.
Проблема с вышеупомянутой реализацией состоит в том, что я не могу удалить запись в исходной группе (даже путем передачи по ссылке или указателю), потому что только объект является частью коллекции.
Поэтому мне нужно было бы сделать коллекцию списком итераторов!
QList<QList<Task>::iterator> collection;
collection.append(ga.getIteratorToTask(1));
...
Поскольку я могу затем использовать соответствующие задачи с помощью разыменования и по завершении я могу стереть его collection[x].erase();
и они исчезают из первоначального списка.
Я до сих пор думаю правильно? Или это даже сложная концепция?
Если в коллекции более одного квеста, я должен использовать QLinkedList
, потому что после манипуляции с генералом QList
, итераторы становятся недействительными … Поэтому я должен реализовать TaskGroup
класс с QLinkedList
вместо QList
?
Применяя эту концепцию на практике, я с разочарованием обнаружил, что erase(iterator)
является частью QList
класс, а не самого итератора. Кажется, поэтому я не могу удалить запись в исходном списке, как я хотел, только с помощью итератора … Мне нужен список для этого. Есть ли какое-то решение для этого?
Может быть, используя Java-как QMutableListIterator
И его remove()
метод вместо QList<Task>::iterator
? QMutableListIterator
имеет недостаток в том, что не поддерживает «итераторскую арифметику». (Я не хочу передавать весь список … Могу ли я передать указатель функции на соответствующий QList<Task>::erase()
функционировать? Я знаю, это звучит безумно, но сейчас я хочу знать, выполним ли мой подход …)
Я думаю, что ваше решение звучит разумно, и вы правы, что вам нужно будет использовать QLinkedList
чтобы избежать аннулирования итератора.
Альтернативный дизайн будет дать Task
обратный указатель на TaskGroup
который владеет ими, и добавить метод TaskGroup
удалить Task
, Task
затем может потребовать, чтобы он был удален из TaskGroup
когда это будет завершено.
Что-то вроде следующего (что я не пробовал):
void Task::Complete()
{
parent->RemoveTask(*this);
}
void TaskGroup::RemoveTask(Task& task)
{
tasklist.removeAll(task);
}
Других решений пока нет …