这是我第一次在AddObject 6的TStringList中使用C++方法,但是我不能向对象列表中添加一个整数。我当然是通过铸造不同的类型来做的。但这不是我想要的。请帮助我做的更简单,为什么对象必须是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;
} 发布于 2014-05-29 08:15:20
为什么对象必须是Tobject*
因为Borland的VCL设计。
mylist->AddObject("r",(TObject *)r);
不要这样做,因为不能保证TStringList不会在AddObject中调用某些TObject*方法。例如,它可以调用objectName()或incrementReference() (我知道,没有TStringList::incrementReference(),但这只是一个例子)。
你所需要的就是std::地图
#include <map>
int main()
{
int r=random(100+1);
std::map< AnsiString, int > myList;
myList[ "r" ] = r;
int a = myList[ "r" ];
}发布于 2014-05-30 02:27:50
用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;
} 发布于 2014-05-29 08:25:33
很难看,但演员们会做得很好的。如果您必须使用TStringList,那么实际的方法就是坚持这种方法。
如果需要,可以将包含“int‘s”的TObject派生包装器添加到另一个向量并使用这些指针,但它需要更多代码来维护第二个列表,更容易出错,而且速度要慢得多。
或者,新建这些包装器并将它们添加到字符串列表中,然后手动管理对象的删除。这很容易出错。
如果可能的话,最好的方法可能是放弃TStringList。使用struct/class或std::结对和std::vector std::deque。
例如:
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;https://stackoverflow.com/questions/23928572
复制相似问题