2017-04-20 34 views
-1

我想訪問Controls組中的所有用戶控件。我使用下面的循環:C++/cli假定控制類型的控制迴路

std::vector<LaminaClass> Laminae; 

for each(Control ^E in Controls) 
{ 
    if (E->GetType() == ClassLibrary1::Lamina_Input1::typeid) 
    { 
     // Create a new lamina class object by copying the current lamina control handle 
     LaminaClass newLam(E); 

     // Put the lamina in the appropriate location in the Laminae vector: 
     Laminae.push_back(newLam); 
    } 
} 

的問題是,即使我過濾控制與if說法,我還是不能假設控制E是的ClassLibrary1::Lamina_Input1類型含義,我不能做任何事情這是特定於該控制類型的/與它。我可以執行一般控制的事情,但不能控制Lamina_Input1控件所特有的任何內容。

我也試過這樣:

std::vector<LaminaClass> Laminae; 

    // For each lamina control in the group of controls: 
for each(ClassLibrary1::Lamina_Input1 ^LamContr in Controls) 
{ 
    // Create a new lamina class object by copying the current lamina control handel 
    LaminaClass newLam(LamContr); 

    // Put the lamina in the appropriate location in the Laminae vector: 
    Laminae.push_back(newLam); 
} 

在這種情況下,我得到以下錯誤: Run-time Error

在調試器: Debugger

我一直停留在這一段時間了。我花了很多時間試圖查找答案,但一直沒有成功(可能是因爲我無法以簡潔的方式準確地描述問題)。

+1

你領導下即與危險可能充滿的路徑,你可以做到這一點,但你必須非常小心,真正知道你做什麼;你介意發現使用C#將會容易得多。 –

+1

還有你的代碼甚至不進行編譯; 'Laminae.push_back(newLam);'應該是'Laminae->的push_back(newLam);'...但後來你爲什麼要使用'載體*'? –

+0

@你完全正確。我修正了這個錯誤。我試圖簡化我的代碼,以更容易地構建我的問題,並肯定犯了一個錯誤。我的實際代碼通過引用將遞歸傳遞給一個函數以及一些遞歸。我認爲這將是其他人更容易看到我的實際問題是,但我應該至少嘗試過了第一。我很抱歉。感謝您的反饋。 –

回答

2

標準警告:雖然當然可以在C++/CLI中編寫應用程序的主體,甚至可以使用WinForms在C++/CLI中編寫GUI,但不建議這樣做。 C++/CLI適用於互操作場景:其中C#或其他.Net代碼需要與非託管C++接口,C++/CLI可以提供這兩者之間的翻譯。對於初級開發,如果你想託管代碼,推薦使用WinForms或者WPF,如果你想要託管代碼,可以使用C++。


您是否在尋找合適的演員陣容?

LaminaClass newLam(dynamic_cast<Lamina_Input1^>(E)); 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

即使你檢查E是你所期望的類型,不改變的E類型,你還是要投它。

for each循環指定一個子類是有效的,但它會做的每個對象的static_cast列表中的那種類型,這是你發現,如果將投無效拋出異常。

1

在C++/CLI中執行此操作的最簡單方法是利用上下文轉換爲bool,也就是說,使用句柄類型作爲條件表達式自動變爲nullptr的比較結果。

例如:

for each(Control ^E in Controls) 
{ 
    if (auto LI = dynamic_cast<ClassLibrary1::Lamina_Input1^>(E)) 
    { 
     LaminaClass newLam(LI); 

     // ... 
    } 
} 

對於那些熟悉C#,這相當於使用as關鍵字,例如

foreach (Control E in Controls) 
{ 
    var LI = E as Lamina_Input; 
    if (LI != null) 
    { 
     new LaminaClass(LI) // ... 
    } 
} 

除了範圍只是if語句本身。在C#7還有最後一個真正的等價物:

foreach (Control E in Controls) 
{ 
    if (E is Lamina_Input LI) 
    { 
     new LaminaClass(LI) // ... 
    } 
}