Это первый раз, когда я использую 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;
}
почему объекты должны быть Tobject *
Из-за дизайна Borland VCL.
mylist-> AddObject («r», (TObject *) r);
Не делайте этого, потому что нет гарантии, что TStringList
не назвал бы некоторые методы TObject*
внутри AddObject
, Например, это может вызвать objectName()
или же incrementReference()
(Я знаю, что нет TStringList::incrementReference()
но это всего лишь пример).
ИМХО, все что тебе нужно это станд :: Карта:
#include <map>
int main()
{
int r=random(100+1);
std::map< AnsiString, int > myList;
myList[ "r" ] = r;
int a = myList[ "r" ];
}
Это очень уродливо, но актерский состав будет работать нормально. Прагматичный подход — придерживаться этого метода, если вы должны использовать TStringList.
Если вы хотите, вы можете добавить производные оболочки TObject, которые содержат ‘int’, к другому вектору и использовать эти указатели, но это требует больше кода для поддержки второго списка, более подвержено ошибкам и намного медленнее.
Либо добавьте новые обертки и добавьте их в список строк, а затем вручную управляйте удалением объектов. Это подвержено ошибкам.
Наилучшим подходом может быть отказ от TStringList, если это возможно. Используйте struct / class или std :: pair и 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;
Использовать 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;
}