Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops c++/假定为控制类型的cli控制循环_Loops_User Controls_C++ Cli - Fatal编程技术网

Loops c++/假定为控制类型的cli控制循环

Loops c++/假定为控制类型的cli控制循环,loops,user-controls,c++-cli,Loops,User Controls,C++ Cli,我想访问controls组中的所有用户控件。我正在使用以下循环: 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 lam

我想访问
controls
组中的所有用户控件。我正在使用以下循环:

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);
    }
}
在本例中,我得到以下错误:

在调试器中:


我已经在这上面呆了一段时间了。我花了很多时间试图查找答案,但都没有成功(可能是因为我无法用简洁的方式准确描述问题)

标准警告:虽然可以使用C++/CLI编写应用程序的主体,甚至可以使用WinForms在C++/CLI中编写GUI,但不建议这样做。C++/CLI是用于互操作场景的:C++或其他.NET代码需要与非托管C++接口,C++/CLI可以提供两者之间的转换。对于主要开发,如果需要托管代码,则建议使用Cype或WiFrm或WPF,或者如果您想要非托管的,则使用MFC C++。
你在找合适类型的演员吗

LaminaClass newLam(dynamic_cast<Lamina_Input1^>(E));
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
newLam(动态_-cast(E));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
即使您检查
E
是您期望的类型,但这不会改变
E
的类型,您仍然必须强制转换它


中为每个
循环指定一个子类是有效的,但它会对列表中的每个对象执行
静态转换
,如您所发现的,如果转换无效,将引发异常

在C++/CLI中实现这一点最干净的方法是利用到
bool
的上下文转换,也就是说,使用句柄类型作为条件表达式自动成为与
nullptr
的比较

例如:

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

        // ...
    }
}
除了范围仅为
if
语句本身。在C#7中,最后有一个真正的等价物:

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