班级TaskGroup
主要包含Task
个列表。我想从各个小组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);
用例类似于“创建在列表中组织的任务 - &gt;选择某些任务 - &gt;将它们添加到待办事项列表(集合) - &gt;显示集合 - &gt;履行任务 - &gt;从集合中删除已完成的任务及其原始列表一次一个 - &gt;重复“。 上述实现的问题是我无法删除原始组中的条目(甚至不能通过引用或指针传递),因为只有对象是集合的一部分。
因此,我需要使集合成为迭代器列表!QList<QList<Task>::iterator> collection;
collection.append(ga.getIteratorToTask(1));
...
因为我可以通过解除引用来使用相应的任务,完成后我可以通过collection[x].erase();
将其删除,然后它们会从原始列表中消失。
到目前为止我是否正确?或者这甚至是一个复杂的概念?
如果集合中每个列表有多个任务,我必须使用QLinkedList
,因为在操纵了一般QList
之后,迭代器变得无效......我是否应该实现{{ 1}}带有TaskGroup
而不是QLinkedList
的课程?
在将这个概念付诸实践的同时,我失望地发现QList
是erase(iterator)
类的一部分,而不是迭代器本身的一部分。看来,我因此无法删除原始列表中的条目,正如我所希望的那样,仅通过迭代器...我需要列表。那有什么解决方案吗?
也许使用类似Java的QList
及其QMutableListIterator
方法而不是remove()
? QList<Task>::iterator
的缺点是不支持“迭代器arithemtics”。 (我不想传递整个列表......我可以将函数指针传递给相应的QMutableListIterator
函数吗?我知道这听起来很疯狂但是在这一点上,我想知道我的方法是否以某种方式可行...)
答案 0 :(得分:1)
我认为您的解决方案听起来很合理,而且您需要使用QLinkedList
来避免迭代器失效。
另一种设计是给Task
一个指向拥有它们的TaskGroup
的指针,并向TaskGroup
添加一个方法来删除Task
。然后Task
可以请求TaskGroup
在void Task::Complete()
{
parent->RemoveTask(*this);
}
void TaskGroup::RemoveTask(Task& task)
{
tasklist.removeAll(task);
}
完成后将其删除。
以下内容(我没有尝试过):
$CBjson->ips = explode(", ", $ips);