0

这是我第一次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;
} 
4

3 回答 3

1

改用一个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-30T02:27:50.417 回答
0

为什么对象必须是 Tobject*

因为Borland的VCL设计。

mylist->AddObject("r",(TObject *)r);

不要这样做,因为不能保证TStringList不会调用TObject*inside的某些方法AddObject。例如它可以调用objectName()or 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" ];
}
于 2014-05-29T08:15:20.080 回答
0

它非常丑陋,但演员阵容会很好。如果必须使用 TStringList,务实的方法是坚持使用该方法。

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

或者,新建这些包装器并将它们添加到字符串列表,然后手动管理对象的删除。这很容易出错。

如果可能的话,最好的方法可能是放弃 TStringList 。使用结构/类或 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;
于 2014-05-29T08:25:33.503 回答