比如我现在有一个父类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;
类创建后将它的指针保存起来就可以了.
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.
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"));
例如:
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
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的类才可以用。
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);
...
不知你认为可以不
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类似的用法云云,我完全不懂。
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;
类创建后将它的指针保存起来就可以了.
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.
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"));
例如:
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
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的类才可以用。
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);
...
不知你认为可以不
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类似的用法云云,我完全不懂。
flowercity兄说的,普通vector就可以,是可以放一般的数据体吧,不带函数的,要是带函数的class好像就不行,我试过了。
ZyxIp兄说的,Tclass类的我还是不大会用,Tclass是什么啊?什么样的class才称Tclss啊?
小弟我是个菜,没学过delphi,好多兄台说的和delphi类似的用法云云,我完全不懂。