2012-12-02 23 views
2

我正在研究一個C++項目,專門實現分流碼算法。確定哪些基類shared_ptr已被傳入超級類shared_ptr向量

我有一個函數可以創建一個類型超類的向量shared_ptr,但是被推入這個向量的類都是基類shared_ptr s。

然後我需要把這個向量傳遞給另一個函數,併爲for循環中的每個向量元素執行不同的邏輯。然而,我執行的邏輯取決於向量的每個元素中存在哪個基類。

所以基本上我不知道的是如何確定哪些類型的基類是在向量的每個元素中。當我調試他們都出來作爲超級類型。

所以一般我願意做這樣的事情:

if(vectorElement == baseClass) 
{ 
    //do some logic 
} 

或者,如果有攜帶這種哪些我失去了我很想在攜帶了一些不同的方法。

+0

我不能說我理解你100%,但你是否正在尋找'dynamic_cast'或'dynamic_pointer_cast'? – Angew

+0

術語基類和超類代表一個類派生自。派生類也被稱爲子類(細微差別:-))。所以請編輯您的帖子以清除 – stefan

+0

可能有一種方法將此實現到我的解決方案中,但我不認爲我可以想象的任何方式都是可行的。 – mcraen

回答

2

你的問題有很多解決方案,坦率地說是OOP中幾乎最常見的問題。

最明顯的就是虛函數在不同的班級做不同的事情:

class SuperClass { 
public: 
    virtual void doSomething(/*someArgsIfNeeded*/) { 
     // some base implementation, possible empty 
     // or just use pure virtual function here 
    } 
}; 

class SubClass : public SuperClass { 
public: 
    virtual void doSomething(/*someArgsIfNeeded*/) { 
     // some base implementation 
    } 
}; 

如下然後使用它:

int SomeArgs; 
std::vector<std::shared_ptr<SuperClass>> objects; 
for (auto it = objects.begin(); it != objects.end(); ++i) 
    it->doSomething(/*someArgsIfNeeded*/); 

其它更復雜的解決方案是使用visitor pattern


它被認爲是不好的做法,使用鑄造(dynamic_cast的),所以總是尋找更多的解決方案OO比鑄造,像這兩個我上面提出的。

+0

我不確定此解決方案是否可以解決我的問題。我知道我可以從vector中調用特定於基類的函數,但是我需要確定哪些類的基類沒有使用函數調用。我實際上並沒有從基類中調用任何函數,而且我也無法修改這些類。 – mcraen

+0

@danner澄清(現在的代碼或其他)這個描述「我有一個函數,創建一個super_class類型的shared_ptr向量,但被推入這個向量的類都是基類shared_ptrs。」... – PiotrNycz

+0

@丹納我的意思是哪些代碼是你的,你可以修改,哪些不是你的,你無法修改... – PiotrNycz

0

關於我的頭頂,一個簡單的解決方案是在基類中有一個函數,它返回一個int值,表示它是哪個類。並且在每個派生類中,重寫此函數以返回不同的值。你可以使用該值來確定哪個類被存儲在向量中

編輯:一般來說,類的具體細節將留在類中,這是多態性的要點。嘗試做派生類的具體計算作爲每個類中的overlying成員函數,並使用它來獲取需要for循環(對於每個新派生類)的值。

+0

通常這樣做自制軟件類型ID是一個壞主意。 dynamic_cast是爲這個問題發明的 – stefan

+0

是的,這是行得通的。我遇到的唯一問題是我正在使用別人的代碼,而AFAIK我無法自己修改這些類。如果一切都失敗了,我可以嘗試這個解決方案,但是如果有一種方法可以不修改那些更喜歡的類。 每個類中都有一個名爲'is_convertable_from'的類,它返回一個布爾值,取決於類是否可以從基類轉換。但我不完全確定它是如何工作的。 – mcraen

+0

*/#define DEF_IS_CONVERTABLE_FROM(type )\ \t公共:。虛擬BOOL is_convertable_from(令牌:: POINTER_TYPE常量&PTR)常量{!\ \t \t返回的dynamic_cast (ptr.get())= 0; \ \t} 這是函數 – mcraen