2014-01-16 30 views
0

我有一個指針,以多態對象的矢量_v_polymorph,我寫了一個模板的方法來收集所有指向特定類型的對象的矢量孩子:搜索特定類型及其在多形指針

template <class T> vector<T*> collect_all() const { 
    vector<T*> v; 
    for (auto e : _v_polymorph) { 
    if (typeid(T) == typeid(*e)) { 
     v.push_back(static_cast<T*>(e)); 
    } 
    } 
    return v; 
} 

我想修改這個,以便在返回的向量中收集子類T的實例。

我的想法在於測試與dynamic_cast的關係,你會這樣做嗎?

+0

只有當類型是多態時,這也是對當前代碼的要求。 –

+0

你確定你需要一個指向不同類型對象的指針嗎?這非常令人震驚。 –

+0

@ Cheersandhth.-Alf該向量包含粒子加速器元素的序列。元素可以是許多類型的磁體或組件。每個組件都有一組特定的參數,並對粒子束執行特定的操作。有時我寫了一個通用組件,然後從其中派生出實現不同跟蹤算法的其他組件,所以這就是爲什麼我想在那裏做這件事。不,我不知道關於Java的任何信息。 – DarioP

回答

1

C++面向對象,以正確的方式:

obj->DoTheRightThing(); // does the right thing! 

錯誤方式:

if ((a = dynamic_cast<A*>(obj))) 
    a->DoTheAThing(); 
else if ((b = dynamic_cast<B*>(obj))) 
    b->DoTheBThing(); 
else ... // what if another sibling is added to A and B? 

的完全破碎方式:

if (typeid(*obj) == typeid(A)) 
    (dynamic_cast<A*>(obj))->DoTheAThing(); 
else ... // what if another sibling OR descendant is added? 

所以,你心裏有什麼是朝着正確的方向邁進 但是,請考慮下一步。

+0

所有對象都是從一個根派生出來的,並存儲在一個向量中,因爲這極大地簡化了所有方法的順序執行。在某些特殊情況下,我想修改一個類型的所有對象,所以我需要以某種方式從列表中選擇它們。在這種情況下,我認爲你的最後一步實際上不可達到,不是嗎? – DarioP

+0

如果在某些情況下做正確的事情是不切實際的,可以做下一件最好的事情,或者修改上下文。爲什麼例外情況例外?你可以讓他們只是普通的普通案例嗎?或者,也許可以將常規業務對象內的異常封裝起來嗎? (在大多數情況下,您可以使用訪問者模式或類似的安排)。 –

0

dynamic_cast將工作,如果類是多態的(至少有一個虛擬成員函數)。

然而,它可能是/更好的主意,不要放棄詳細的類型信息。

例如,通過將其放置到類中來限制對矢量的訪問。然後,在將一個對象指針添加到通用指針向量的函數中,將它添加到它自己的更多類型特定的集合中。每個更具體的對象需求的一個集合。

相關問題