Generics 在C+中使用带有接口的通用TList+;建设者
如何在C++Builder中创建接口实例列表?我正在尝试以下方法,但编译器会以不同的方式对每种方法进行投诉:Generics 在C+中使用带有接口的通用TList+;建设者,generics,c++builder,Generics,C++builder,如何在C++Builder中创建接口实例列表?我正在尝试以下方法,但编译器会以不同的方式对每种方法进行投诉: #include <System.Generics.Collections.hpp> ... TList__1<IInterface> IntfList; TList__1<_di_IInterface> IntfList; TList__1<DelphiInterface<IInterface>> IntfList; #包括
#include <System.Generics.Collections.hpp>
...
TList__1<IInterface> IntfList;
TList__1<_di_IInterface> IntfList;
TList__1<DelphiInterface<IInterface>> IntfList;
#包括
...
TList_u_1Intflist;
TList_u_1Intflist;
TList_u_1Intflist;
另一方面,我也无法生成包含对象的列表
TList__1<TObject> ObjList = new TList__1<TObject>();
TList__1objlist=new TList__1();
看来我完全迷路了,医生也帮不了我
或者有没有其他更好的方法?最后,我需要一个数组,但是我想动态地使用<代码>添加<代码>,然后从TList\uuu 1*MyList=newtlist\uu 1;
...
删除MyList;
其中,T
可以是\u接口
,TObject*
(注意*
)等
现在,尽管如此
如何在C++Builder中创建接口实例列表
简而言之,在纯C++代码中不能用“代码”> tList</代码>自己完成。这是记录在案的行为:
Delphi泛型以C++为模板。然而,重要的是要认识到实例化发生在Delphi方面,而不是在C++中。因此,您只能对Delphi代码中显式实例化的类型使用这些模板
<>强>如果C++代码试图在Delphi中实例化的类型使用Delphi泛型,则在链接时间>/P>会出错。 本机RTL或VCL/FMX框架中没有默认的TList
实例化。因此,您必须将自己的Delphi代码添加到C++Builder项目中,以创建此类实例化,例如:
MytListInstallationUnit.pas
单位MytListInstallationUnit;
接口
{$HPPEMIT'#pragma链接“mytlistinstationunit”}
//或者在XE5更新2及更高版本中:
//{$HPPEMIT LINKUNIT}
实施
使用
系统、泛型、集合;
初始化
TList.Create.Free;
定稿
结束。
mycppunt.cpp
#包括
#包括“MytListInstallationUnit.hpp”
...
TList__1*IntfList=new TList__1;//现在该工作了
否则,您可以使用:
#包括
...
TInterfaceList*IntfList=新的TInterfaceList;
...
删除IntfList;
< P>或,如果您不需要跨越C++/Delphi边界传递接口列表,则考虑使用PURE C++容器,如<代码> STD::vector < /C> >,例如:
#包括
...
std::向量IntfList;
至于TList
,它实际上存在于本机Delphi RTL中,但它不适用于您,因为您没有正确使用它。它需要看起来更像这样:
TList\uuu 1*ObjList=newtlist\uu 1;
...
删除对象列表;
否则,您可以使用,例如:
#包括
...
TObjectList*ObjList=新的TObjectList;
...
删除对象列表;
或者,只使用<代码> STD::向量。
谢谢@ RemyLebeau,我真的在为我们的Delphi库中的C++例子而奋斗,各种各样的问题都在前面,我没有线索。这就解释了,我希望TList的文档也能指向那篇文章。-所以我的Delphi类需要一个DynamicArray——如果我没看错的话,没有一个简洁的方法来构建它,除非先从数组开始?@JouniAro使用DynamicArray不需要TList。它们是完全不同的东西。但是是的,如果您需要传入DynamicArray,那么您必须根据需要构造和填充它,例如:DynamicArray arr;阵列长度=…;/*填写arr…*/MyComponent->DoSomething(arr)是的,我当然知道。TList更便于填充,无需预先定义长度。这就是我在Delphi示例中使用它的原因,我正在尝试复制它。但是我不需要。Tx用于清除这些内容。@Journiaro“TList更方便填写,无需预先定义长度”-除非您需要与Delphi代码交互,否则我只会使用std::vector
。是的,这是与Delphi组件交互的示例代码,因此它需要一个动态carray。是否有任何简单的方法可以将std类型转换为Delphi(?)类型,例如std::vector到DynamicCarray?我猜DynamicCarray是Delphi类型的,不是吗?