TStringList中的AddObject

时间:2014-05-29 08:02:43

标签: c++ c++builder tstringlist

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

3 个答案:

答案 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;
}