c++Builder 关于TStringList的问题

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *tmpstrlist = new TStringList;
tmpstrlist->Add("11111");
tmpstrlist->Add("22222");
tmpstrlist->Add("33333");
AnsiString *anptr = &(tmpstrlist->Strings[1]); //定义AnsiString型指针,指向第二项
Button1->Caption = *anptr; //为什么不是 "22222",而是""
delete tmpstrlist;
}

就这样一段代码
TStringList的Items是AnsiString类型,定义AnsiString型指针,指向第二项,
为什么通过指针不能取到第二项的内容?

十分不理解,哪里的问题,谢谢!!!

从外部引用对象的成员地址不正确,违背了对象封装的本意,你只能通过对象本身调用其成员。所以:
AnsiString *anptr = &(tmpstrlist->Strings[1]);
Button1->Caption = *anptr;
应改为:
AnsiString anptr = tmpstrlist->Strings[1];
Button1->Caption = anptr;追问

谢谢
之所以用指针只是为了提高效率
既然直接构造一个AnsiString对象 ,再考虑一下

不过这种禁用指针还是很强悍,虽然有些霸道,他如何实现的?谢谢

追答

对象的设计其中一个目的就是实现数据的封装,私有数据被对象封装起来,外部不可以直接调用,只能通过其提供的方法访问,一般你使用到的数值调用,大多都是通过Get()和Put()方法调用的,而不是直接通过对象内部数据的地址来访问的。你可以在外部用指针引用对象本身,不可以引用其内部的成员地址,除非你用友元函数或子类。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-17
你尝试换一个编译工具,用visual studio试试追问

抱歉,这种建议无法接受。

追答

你的指针变量既然调用Add函数,那应该把Add函数也拿出来看看撒

追问

tmpstrlist->Strings[1]
是AnsiString类型对象是没任何问题的

相似回答