2011-07-25 69 views
0

我已經在C++/CLI如下:(把我的錯誤的音符評論)鑄造問題 - 不會編譯

class Base{...} 

class Derived : public Base{...} 

public ref class CliClass 
{ 
    public: 
    std::list<Base*> *myList; 

    CliClass() 
    { 
    myList = new list<Base*>(); 
    } 

    AddToList(Derived *derived) 
    { 
     myList->push_back(derived); 
    } 

    DoCast() 
    { 
     Derived *d = nullptr; 

     int n = (int)myList->size(); 
     for(int i = 0; i < n; i++) 
     { 

     //this following does not compile 
     //error C2440: 'type cast' : cannot convert from 'std::list<_Ty>' to 'Derived *' 

     d = (Derived*)myList[i];  

     //I've also tried this -which does not compile 
     //error C2682: cannot use 'dynamic_cast' to convert from 'std::list<_Ty>' to 'Derived *' 

     d = dynamic_cast<Derived*>(myList[i]); 


     } 
    } 
} 

我想投myList中[I]到派生類型..但它不會允許我。

關於如何正確投射這個任何建議? (編譯並且運行時安全 - 即如果錯誤類型不會被炸掉)

+1

這段代碼甚至是否正確?它看起來很腥。我不知道CLI,但是這個怎麼樣:1)'std:List'實際上是一個真正的類型? 2)你聲明'myList'作爲一個對象,然後嘗試在'CliClass :: CliClass()'中分配一個指向它的指針 - 怎麼樣? 3)列表沒有隨機訪問,你爲什麼寫'[我]'? –

+0

@Kerrek SB:1)是的。 2)對不起,myList應該是一個指針。補充說。 3)這可能是我的問題嗎?它編譯..我認爲我可以通過索引 – developer

+1

訪問我從來沒有聽說過類型'std :: List'(大寫'L'),是一個CLI擴展?無論如何,在'myList =新列表();'中列出的限定類型是什麼?最後,隨着你現在的改變,'myList [i]'把'myList'視爲**數組**,肯定不是你想要的! –

回答

1

你完全搞錯了。假設你有幾個錯字在你的代碼和平均std::list,你正在說:

std::list<Base*> * myList; 

/* ... */ 

myList[i] = /* ... */ ; 

最後一行把myList數組列表,它從未創建過!訪問列表元素的方式是迭代。

這裏是一個骨架重寫,希望您能夠從中提取的修補程序:

public ref class CliClass 
{ 
public: 
    std::list<Base*> * myList; 

    CliClass() : myList(new std::list<Base*>()) { } 

    DoCast() 
    { 
    for(auto it = myList->cbegin(), end = myList->cend(); it != end; ++it) 
    { 
     Derived * const d = dynamic_cast<Derived*>(*it); 
     /* do something useful with d */ 
    } 
    } 
}; 
+0

這樣好多了,雖然'd = * it;'仍然需要強制轉換。我可能也建議使用智能指針而不是原始指針,它確實有助於防止內存泄漏。我有一個例子發佈在http://codereview.stackexchange.com/questions/1695/scoped-ptr-for-c-cli-ensure-managed-object-properly-frees-owned-native-object –

+0

哦,d'哦,它是基於派生的,而不是派生到基礎 - 編輯! –

+0

重新編寫智能指針:關於這個問題,我會有整整一頁的評論,但是因爲它是CLI而我沒有或者不瞭解CLI,所以我非常小心。我不知道你可以在多大程度上混合使用CLI和本地結構。例如,你可以讓'myList'成爲一個直接的成員對象嗎? –

0

std :: list中的C++沒有運算符[]。
除了它是std ::列表而不是標準:列表

因此,代碼可能試圖將列表轉換爲Derived *,然後可能會嘗試對結果使用[]運算符。

因此,只需找到另一種存儲數據的方式(例如std::map<int,Base*>)。

事情是這樣的:

std::for_each(myList.begin(), myList.end(), DoSomething); 

void DoSomething(Base* item) 
{ 
    Derived* d = dynamic_cast<Derived*>(item); 

} 

或直進的方式(如果你沒有正確的宏):

for (std::vector<Base*>::iterator item = myList.begin(); item != myList.end(); ++item) { //Iterate through 'myList' 
    Derived* d = dynamic_cast<Derived*>(*item); 
} 
+0

對不起,用std :: list打字。(我在真實的代碼中有這種情況,我的道歉是我不能把真正的代碼放在保密/知識產權的原因上)我仍然想使用std :: list。我能不能通過列表以某種方式迭代嗎?因爲我覺得如果不行的話就會打敗列表的目的! – developer

+0

http://www.cplusplus.com/reference/stl/list/ –

+0

你能提供一個它如何工作的例子嗎?不知道如何通過for循環的每次訪問來訪問列表中的特定項目。 – developer