AddObject(“r”,(TObject*)r; int i=mylist->IndexOf(“r”); inta=(int)(mylist->Objects[i]); 库特,c++,c++builder,tstringlist,C++,C++builder,Tstringlist" /> AddObject(“r”,(TObject*)r; int i=mylist->IndexOf(“r”); inta=(int)(mylist->Objects[i]); 库特,c++,c++builder,tstringlist,C++,C++builder,Tstringlist" />

在TStringList中添加对象 这是我第一次在C++ Builder 6中使用 Advase方法,在 TSTRIGLISTUCT/ 例如,我不能在对象列表中添加整数。当然,我是通过铸造不同的类型来实现的。但这不是我想要的。请帮我简单一点 以及为什么对象必须是对象列表中的Tobject* 这是我的简单程序 #include <vcl.h> #include <iostream.h> #include <conio.h> #pragma hdrstop #pragma argsused int main(int argc, char* argv[]) { int r=random(100+1); TStringList *mylist=new TStringList; mylist->AddObject("r",(TObject *)r); int i=mylist->IndexOf("r"); int a=(int)(mylist->Objects[i]); cout<<a<<endl; getch(); return 0; } #包括 #包括 #包括 #布拉格语hdrstop #布拉格语 int main(int argc,char*argv[]) { int r=随机(100+1); TStringList*mylist=新的TStringList; mylist->AddObject(“r”,(TObject*)r; int i=mylist->IndexOf(“r”); inta=(int)(mylist->Objects[i]); 库特

在TStringList中添加对象 这是我第一次在C++ Builder 6中使用 Advase方法,在 TSTRIGLISTUCT/ 例如,我不能在对象列表中添加整数。当然,我是通过铸造不同的类型来实现的。但这不是我想要的。请帮我简单一点 以及为什么对象必须是对象列表中的Tobject* 这是我的简单程序 #include <vcl.h> #include <iostream.h> #include <conio.h> #pragma hdrstop #pragma argsused int main(int argc, char* argv[]) { int r=random(100+1); TStringList *mylist=new TStringList; mylist->AddObject("r",(TObject *)r); int i=mylist->IndexOf("r"); int a=(int)(mylist->Objects[i]); cout<<a<<endl; getch(); return 0; } #包括 #包括 #包括 #布拉格语hdrstop #布拉格语 int main(int argc,char*argv[]) { int r=随机(100+1); TStringList*mylist=新的TStringList; mylist->AddObject(“r”,(TObject*)r; int i=mylist->IndexOf(“r”); inta=(int)(mylist->Objects[i]); 库特,c++,c++builder,tstringlist,C++,C++builder,Tstringlist,为什么对象必须是对象* 因为Borland的VCL设计 mylist->AddObject(“r”,(TObject*)r 不要这样做,因为不能保证TStringList不会在AddObject内部调用TObject*的一些方法。例如,它可以调用objectName()或incrementReference()(我知道,没有TStringList::incrementReference(),但这只是一个例子) IMHO,你所需要的只是: #包括 int main() { int r=随机(100

为什么对象必须是对象*

因为Borland的VCL设计

mylist->AddObject(“r”,(TObject*)r

不要这样做,因为不能保证
TStringList
不会在
AddObject
内部调用
TObject*
的一些方法。例如,它可以调用
objectName()
incrementReference()
(我知道,没有
TStringList::incrementReference()
,但这只是一个例子)

IMHO,你所需要的只是:

#包括
int main()
{
int r=随机(100+1);
std::mapmyList;
myList[“r”]=r;
int a=myList[“r”];
}

这很难看,但演员阵容可以很好地发挥作用。如果必须使用TStringList,务实的做法是坚持使用这种方法

如果您愿意,您可以将包含int的TObject派生包装器添加到另一个向量,并使用这些指针,但它需要更多的代码来维护第二个列表,更容易出错,速度也慢得多

或者,新建这些包装并将其添加到stringlist,然后手动管理对象的删除。这很容易出错

如果可能的话,最好的方法可能是抛弃TStringList。使用结构/类或std::pair和std::vector或std::deque

e、 g

typedef std::pair MyValue;
typedef std::向量MyValueList;
我的价值清单;
list.push_back(MyValue(“hello”,1));
AnsiString const&s=列表[0]。第一;
int i=列表[0]。秒;

使用
std::map
或其他合适的容器,例如:

#pragma hdrstop

#include <iostream.h>
#include <conio.h>
#include <map>

#pragma argsused

int main(int argc, char* argv[])
{
    int r = random(100+1);
    std::map<std::string, int> mylist;
    mylist["r"] = r;
    int a = mylist["r"];
    cout << a << std::endl;
    getch();
    return 0;
} 
#pragma hdrstop
#包括
#包括
#包括
#布拉格语
int main(int argc,char*argv[])
{
int r=随机(100+1);
地图mylist;
mylist[“r”]=r;
int a=mylist[“r”];

我想提出使用一个不超过十年的标准编译器的建议,因为这种笨拙的铸造是丑陋的。这不是编译器问题。它更像是一个类选择/库问题。它可以用与任何现代C++编译器相同的技术来解决。struct的
std::vector
,或者
std::map
。如果列表中有重复的字符串呢?您认为这在内存消耗和速度方面的性能是什么样的?如果有重复的,那么OP可以使用
multimap
。就好像OP使用VCL一样,我认为他没有考虑性能:)在XE5之前,C++Builder不支持任何移动开发,因此
TStringList
没有在其
TObject*
指针上调用任何方法,因此可以安全地存储您想要的任何内容,只需键入cast即可。它工作得很好。然而,在XE5和更高版本中,仅在iOS和Android平台上,ARC(自动引用计数)用于Delphi风格(
TObject
-派生)对象,因此将非对象指针存储在
TStringList
或使用
TObject*
指针的任何其他对象中不再安全,因为编译器管理的引用计数。因此,请改用另一个容器,例如
std::map
。只有在使用C++构建时才需要创建基于
TObject
的包装器er XE5或更高版本,用于iOS/Android移动开发,由于使用了ARC。在其他平台上,不使用ARC,因此类型转换是安全的。
typedef std::pair<AnsiString, int> MyValue;
typedef std::vector<MyValue> MyValueList;

MyValueList list;
list.push_back(MyValue("hello", 1));

AnsiString const& s = list[0].first;
int i = list[0].second;
#pragma hdrstop

#include <iostream.h>
#include <conio.h>
#include <map>

#pragma argsused

int main(int argc, char* argv[])
{
    int r = random(100+1);
    std::map<std::string, int> mylist;
    mylist["r"] = r;
    int a = mylist["r"];
    cout << a << std::endl;
    getch();
    return 0;
}