有什么容器或是数组可以存放不同类型的数据吗??

时间:2022-06-05 19:34:37
如题:
比如我现在有一个父类class A,
由它派生出了很多子类class A1, class A2 ……
现在我有一堆数据来自不同的子类
判断
符合条件的就存入一个叫做layer的数组或是容器 ///?????不知有没有这样的咚咚?
                                           ///我想vector<A>肯定不行的
然后我调用起来很方便可以直接layer[153].print();// layer[153]可以是任意类型的

各位大哥帮帮忙,看看有没这样的咚咚,谢谢了

13 个解决方案

#1


我在线上等呢,马上结分:)

#2


要放不同的对象吗?
类创建后将它的指针保存起来就可以了.

TList 就可以保存的是创建的对象的指针.

var
  myclass1:TMyClass1;
  myclass2:TMyClass2;
  AList:TList;
begin
  alist:=tlist.create;
 Myclass1:=TMyclass1.create;
 alist.add(myclass1);
  myclass2:=TMyclass2.create;
 alist.add(myclass2);

///使用
 TMyClass1(Alist.items[0]).XXXXXXXX;

主要是你是知道这个指针指向的是哪个对象

你也可以这样
if   TObject(AList.items[0]) is TMyClass1 then
  TMyClass1(Alist.items[0]).XXXXXXXX;
  
   
end;

#3


呵呵才发现是C++版,我以为是DELPHI 版.

C++ Builder 的类框架和DELPHI 很象吧,是不是也有TLIST.

#4


TStringList *a = new TStringList可以

#5


STD::Vector<>

#6


vector
里面放结构体就可以

#7


我和楼上的,是同一个观点。将结构体放到容器中,操作容器就行了,结构体的内容,看具体情况定。

不才,请高手指正!!!

#8


其实我比较赞同二楼所说的方法,在C++当中也有一个相当于Delphi的is的类方法,即InheritsFrom
例如:
if(Form1->InheritsFrom(__classid(TForm))
   ShowMessage("Form1 is Inherited From TForm!");
else
   ShowMessage("Form1 is not Inherited From TForm!");

另外还有就是方法MethodAddress,对于这个来判断是否有相同的方法有点儿过于牵强,即可能还需要考虑参数的问题,否则会非法操作,但是对于某些常规性写法还是可以一试,不过还需要注意的是需要的是能够在事件查看器可以查看到的,即由__property传递过去的,例假设为TForm1添加了OnCreate的处理过程:
ShowMessage((int)MethodAddress(__classid(TForm1),"FormCreate"));

#9


InheritsFrom若不以类函数来使用,而第一个参数为子类的classid:
InheritsFrom(__classid(TForm1),TForm)相当于Delphi当中的 TForm1 is TForm

#10


vector和list之类都可以,甚至直接建立一个普通数组也没什么问题。
A* arr[100];
给数组中每一个元素new实例的时候,new不同的子类就可以了。

至于判断一个实例是不是继承自某个父类,可以使用dynamic_cast关键字。
A1 a1;
A* pa = dynamic_cast<A*>(&a1);
如果&a1可以被转化为A*型,那么就会成功转换,否则会返回NULL。

僵哥说的InheritsFrom也可以,不过只能用于继承自TObject的类,也就是只有vcl的类才可以用。

#11


OleVariant类型

short WordBool
int Byte
float  Variant
double  WideString
Currency  wchar_t*
TDateTime  Ole2::IDispatch*
bool  Ole2::IUnknown*

如设为数组
  int Bounds[2] = {0,14};
 OleVariant A1 = VarArrayCreate(Bounds,1, varVariant);

值写入:

    A1.PutElement("sdfasdf",1);                 //发件人
     A1.PutElement(132456.23,2);

...
不知你认为可以不


#12


谢谢各位大哥,各位学习
之前我还没等到有人回答我就下班了,后来就一直没找到我这帖子,现在好了
散分了:-)

#13


Maconel兄的方法可以,我试过了。不过把内存问题丢给了操作系统,还额外消耗了存放指针数组的内存,“A arr[100];”就要消耗掉400字节的内存,如果我元素的量很大呢,而系统的内存又很有限这样子好像就不大好了。
flowercity兄说的,普通vector就可以,是可以放一般的数据体吧,不带函数的,要是带函数的class好像就不行,我试过了。
ZyxIp兄说的,Tclass类的我还是不大会用,Tclass是什么啊?什么样的class才称Tclss啊?

小弟我是个菜,没学过delphi,好多兄台说的和delphi类似的用法云云,我完全不懂。

#1


我在线上等呢,马上结分:)

#2


要放不同的对象吗?
类创建后将它的指针保存起来就可以了.

TList 就可以保存的是创建的对象的指针.

var
  myclass1:TMyClass1;
  myclass2:TMyClass2;
  AList:TList;
begin
  alist:=tlist.create;
 Myclass1:=TMyclass1.create;
 alist.add(myclass1);
  myclass2:=TMyclass2.create;
 alist.add(myclass2);

///使用
 TMyClass1(Alist.items[0]).XXXXXXXX;

主要是你是知道这个指针指向的是哪个对象

你也可以这样
if   TObject(AList.items[0]) is TMyClass1 then
  TMyClass1(Alist.items[0]).XXXXXXXX;
  
   
end;

#3


呵呵才发现是C++版,我以为是DELPHI 版.

C++ Builder 的类框架和DELPHI 很象吧,是不是也有TLIST.

#4


TStringList *a = new TStringList可以

#5


STD::Vector<>

#6


vector
里面放结构体就可以

#7


我和楼上的,是同一个观点。将结构体放到容器中,操作容器就行了,结构体的内容,看具体情况定。

不才,请高手指正!!!

#8


其实我比较赞同二楼所说的方法,在C++当中也有一个相当于Delphi的is的类方法,即InheritsFrom
例如:
if(Form1->InheritsFrom(__classid(TForm))
   ShowMessage("Form1 is Inherited From TForm!");
else
   ShowMessage("Form1 is not Inherited From TForm!");

另外还有就是方法MethodAddress,对于这个来判断是否有相同的方法有点儿过于牵强,即可能还需要考虑参数的问题,否则会非法操作,但是对于某些常规性写法还是可以一试,不过还需要注意的是需要的是能够在事件查看器可以查看到的,即由__property传递过去的,例假设为TForm1添加了OnCreate的处理过程:
ShowMessage((int)MethodAddress(__classid(TForm1),"FormCreate"));

#9


InheritsFrom若不以类函数来使用,而第一个参数为子类的classid:
InheritsFrom(__classid(TForm1),TForm)相当于Delphi当中的 TForm1 is TForm

#10


vector和list之类都可以,甚至直接建立一个普通数组也没什么问题。
A* arr[100];
给数组中每一个元素new实例的时候,new不同的子类就可以了。

至于判断一个实例是不是继承自某个父类,可以使用dynamic_cast关键字。
A1 a1;
A* pa = dynamic_cast<A*>(&a1);
如果&a1可以被转化为A*型,那么就会成功转换,否则会返回NULL。

僵哥说的InheritsFrom也可以,不过只能用于继承自TObject的类,也就是只有vcl的类才可以用。

#11


OleVariant类型

short WordBool
int Byte
float  Variant
double  WideString
Currency  wchar_t*
TDateTime  Ole2::IDispatch*
bool  Ole2::IUnknown*

如设为数组
  int Bounds[2] = {0,14};
 OleVariant A1 = VarArrayCreate(Bounds,1, varVariant);

值写入:

    A1.PutElement("sdfasdf",1);                 //发件人
     A1.PutElement(132456.23,2);

...
不知你认为可以不


#12


谢谢各位大哥,各位学习
之前我还没等到有人回答我就下班了,后来就一直没找到我这帖子,现在好了
散分了:-)

#13


Maconel兄的方法可以,我试过了。不过把内存问题丢给了操作系统,还额外消耗了存放指针数组的内存,“A arr[100];”就要消耗掉400字节的内存,如果我元素的量很大呢,而系统的内存又很有限这样子好像就不大好了。
flowercity兄说的,普通vector就可以,是可以放一般的数据体吧,不带函数的,要是带函数的class好像就不行,我试过了。
ZyxIp兄说的,Tclass类的我还是不大会用,Tclass是什么啊?什么样的class才称Tclss啊?

小弟我是个菜,没学过delphi,好多兄台说的和delphi类似的用法云云,我完全不懂。