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) // ...
}
}