我對Qt的foreach函數有點問題。我有一個類短語,它是QList的一個子類。在〜短語中,我刪除了所有GlossItem指針。Qt的foreach表達式需要深度複製嗎?
在通過樂句GlossItem指針迭代,我想用Qt的的foreach:
// phrase is a pointer to a Phrase object,
// which is a subclassed QList<GlossItem*>
foreach(GlossItem *glossItem , *phrase)
{
// use glossItem
}
出於某種原因的foreach正在執行對短語深拷貝(我知道這是因爲它要求我執行復制構造函數)。但是,如果有短語的副本 - 並且我不想創建每個GlossItem的深層副本 - 這意味着這些指針將被刪除兩次。 (或者,刪除一次,然後崩潰。)所以我必須使用這個,它可以工作,但不那麼漂亮。
for(int i=0; i<phrase->count(); i++)
{
GlossItem *glossItem = phrase->at(i);
// use glossItem
}
有沒有辦法解決這個問題,還是我只需要忍受它呢?
在你的第一個例子中,你使用了一個索引變量'i' - 哪裏適合? –
此外,我沒有看到任何證據表明'QList'有一個虛擬析構函數,它允許你從它繼承。 –
這不是一個好設計:容器意味着被複制,刪除其中的內容將會破壞(使用Q_DISABLE_COPY來防止複製)。正如託尼所說,QList沒有虛擬驅動器,所以從它繼承並不是一個好主意。設計提示:永遠不要從容器繼承,而是使它們成爲某些包裝類的成員。類短語{QList list()const; ... Q_DISABLE_COPY(Phrase)}; –