这是我第一次在AddObject
的C ++ Builder 6中使用TStringList
方法
但是我不能在对象列表中添加一个整数。当然,我是通过铸造不同类型的方式来做到的。但这不是我想要的。请帮我简单一点
以及对象在对象列表中必须为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;
}
答案 0 :(得分:0)
为什么对象必须是Tobject *
由于Borland的VCL设计。
mylist-&gt; AddObject(“r”,(TObject *)r);
不要这样做,因为无法保证TStringList
不会在TObject*
内调用AddObject
的某些方法。例如,它可以调用objectName()
或incrementReference()
(我知道,没有TStringList::incrementReference()
,但这只是一个示例。)
恕我直言,您需要的只是std::map:
#include <map>
int main()
{
int r=random(100+1);
std::map< AnsiString, int > myList;
myList[ "r" ] = r;
int a = myList[ "r" ];
}
答案 1 :(得分:0)
它非常丑陋,但演员表现得很好。如果必须使用TStringList,那么实用的方法是坚持使用该方法。
如果你愿意,你可以添加TObject派生的包装器,它们将&#39; int&#39;添加到另一个向量并使用这些指针,但它需要更多的代码来维护第二个列表,更容易出错和很多慢点。
或者新建这些包装器并将它们添加到stringlist中,然后手动管理对象的删除。这很容易出错。
如果可能的话,最好的方法可能是抛弃TStringList。使用struct / class或std :: pair和std :: vector或std :: deque。
e.g。
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;
答案 2 :(得分: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;
}