我的程序如下:
CListBox *plist;
CString  *pName;
int i;
for(i = 0;i<=num;i++)
{
plist->GetText(i,pName); 
this->MessageBox(pName,NULL,MB_OK); 
}
编译后编译器说不能把class CString * 转换为 char * 当我用(char *)进行
强制转换后编译器又说pName没有被初始化。

解决方案 »

  1.   

    你把CString *pName 改为 CString strName不就OK了,其实用你所有的调用编译器用了
     GetText(int ,LPTSTR)这个实现!
      

  2.   

    char* 是字符串指针,使用前需给它一个有效的地址。
    char*[] 是字符批针数组,使用前应给每一个素一个有效的地址。
    const char* 是一个不能改变内容的字符指针,声明时需给出有效的地址。
    CString是封装的一个可变长字符串的类。它的指针可变。遗憾的是,前两位朋友所说的方法都不正确。正确用法:
    CListBox* plist;
    CString sName;
    char cName[nnn];/*看你的字串长度定nnn的值*/plist = /*有效的且显示在窗口上的LIST的窗口指针*/;
    for (int i = 0; i <= num; i ++)
    {
    plist->GetText(i, cName);
    sName = cName;
    MessageBox(sName, NULL);
    }或
    CListBox *plist;
    CString pName;plist = valide list control which has been created;
    for (int i = 0; i <= num; i ++)
    {
    pName.Empty;
    plist->GetText(i, pName.GetBufferSetLength(nnn));
    MessageBox(pName, NULL);
    }
      

  3.   

    谢谢各位的答复,我用了evelan的方法解决了我程序的问题其它的方法我还没有试。但是我又有了新的问题.......
    --------------------------------------------------
    TV_INSERTSTRUCT tvinsert;
    CString sDrive = "C:\\";
    tvinsert.item.pszText = sDrive;  //rise error 
    ----------------------------------------------
    此时。由于pszText 是 char * 我就做了如下转换
    tvinsert.item.pszText = (LPTSTR) &sDrive;
    编译正确。可是这个TREEVIEW该节点的TEXT不是C:\而是一些乱七八糟的字符
    于是我又改变了一下转换
    tvinsert.item.pszText = (LPTSTR &)sDrive;
    编译便正确了。显示的字符也正确
    我要闻的问题是
    这是为什么,他们的区别是什么
    再次谢谢给位?
      

  4.   

    Kenny说的正确
    char* 是字符串指针,使用前需给它一个有效的地址。
    char*[] 是字符批针数组,使用前应给每一个素一个有效的地址。
    const char* 是一个不能改变内容的字符指针,声明时需给出有效的地址。
    CString是封装的一个可变长字符串的类。它的指针可变。
    yarao,从你新的问题看出,你还是没有弄明白他们的关系
    感觉你没有用过C一样,是不是被VB毒害的?
    其实在C里没有真正的字符串。
    所谓的字符串是一个由\0结尾的char型的一维数组
    一般的文档会叫它为null-terminated string 
    加了const,表示它的内容不能再被修改
    等于是你告诉编译器,“这个变量的值不能改哦,谁改了你就告发它,然后罢工”
    当你觉得某个变量不应该被修改时
    加const是个好习惯,因为你可以在编译的时候就得到错误
    关于CString
    CString是个类,它通过重载操作符使得字符串。
    不懂重载操作符?
    去温习一下C++
    (谁打我?)
    (台下的人:“你牛什么啊牛”)
    哎呀,其实我也是为你好,要明白错误,必须要搞明白问题的关键
    比如CString重载了操作符“=”
    你用
    CString sOne="你要做什么?";
    其实等于
    char cOne[256];
    strcpy(cOne,"你要做什么?");
    绝对不等于
    char cOne[256];
    cOne="你要做什么?"而且CString会自动的管理内存分配
    你就不用去担心会不会溢出了ok,回到你上面的问题TV_INSERTSTRUCT tvinsert;
    CString sDrive = "C:\\";
    tvinsert.item.pszText = sDrive;  //rise error 为什么错呢?
    因为tvinsert.item.pszText的类型是LPTSTR
    也就等于是char *
    而CString只有一个    
    operator LPCTSTR ( ) const
    不懂“operator LPCTSTR ( ) const”什么意思?
    再去温习一下C++
    (哇靠,还好我躲的快。 下次不要用西红柿好不好?)
    所以编译器不会自动的转换。
    那么为什么
    tvinsert.item.pszText = (LPTSTR) &sDrive;
    也不对呢?
    因为&sDrive,你是取到了sDrive这个CString对象的地址
    然后你又把这个地址强行转换为LPTSTR,那怎么会对呢
    再看看
    tvinsert.item.pszText = (LPTSTR &)sDrive;
    其实也是歪打正着
    我没有明白为什么编译正确还可以正确?
    正确的用法应该是
    tvinsert.item.pszText = (LPTSTR)(LPCTSTR)sDrive;
      

  5.   

    谢谢roylou的支持。本来看到问主的回答,我都不想上来胡邹了,但看到你的诲人不倦,颇为感动,于是想再提醒yarao一下,就是用evelan的方法,存在着严重的隐患。因为正象roylou所说,CString类的内存管理是自动的,它的数据区的管理需通过调用它的成员函数来完成。如果用evelan的方法,由于数据区的地址是CString的操作符成员函数LCTSTR自动完成,而数据区的大小未经CString的成员函数管理,从而轻则引起一个编译器无法觉察的内存溢出,重则由于破坏不该修改的内存而导致程序崩溃。
      

  6.   

    非常感谢Kenny和royluo两位的帮助。他们诲人不倦,认真负责的态度值得我们学习
    我的问题现在已经解决。但是我的心里却充满了更多的疑惑。
    A:
        CString 是一个指向字符串的指针吗?
    B:
        CListBox::GetText(int ,LPTSTR)中 evelan说我只要把CString * pName 换位
    CString strName 调用该函数即可。是不是 CString 就是与 LPTSTR等价呢?
    C:
    tvinsert.item.pszText的类型是LPTSTR为什么我不能用
    CString sDrive;
    tvinsert.item.pszText = sDrive;
    D:
    LPTSTR,LPCTSTR,CString 它们之间到底存在什么样的转换关系。在msdn上说我们可以通过GetBuffer()成员函数把CString用为LPTSTR。而为什么不能用(LPTSTR)进行类型转换了。
    我决定将分数加高!希望Kenny和royluo及各位网友不吝赐教
                                  谢谢
                                  yarao   2000.5.27
      

  7.   

    废话少说,开侃
    A:
    CString 是一个类
    你使用
    CString sMyName;
    那么sMyName就是一个CString的对象
    它与字符串的指针无关,只不过类CString是一个处理字符串的类
    B:
    不等价
    那样理解也是绝对错误的。
    你只所以可以那样做
    不是因为
    CListBox有一个
    int GetText( int nIndex, LPTSTR lpszBuffer ) const;
    是因为它同时还有一个
    void GetText( int nIndex, CString& rString ) const;
    你看看MSDN的关于CListBox::Gettext的Help就知道了
    系统是使用的
    void GetText( int nIndex, CString& rString ) const;
    C:
    很气愤,我想暴打你一顿,然后烤来吃
    因为我前面已经说过了
    tvinsert.item.pszText的类型是LPTSTR
    而CString只有LPCTSTR的转换函数
    所以编译器不会自动的转换。
    D:
    LPTSTR == char* 是字符串“指针”,使用前需给它一个有效的地址。
    LPCTSTR == const char* 是一个不能改变内容的字符“指针”,声明时需给出有效的地址。
    CString是封装的一个可变长字符串的“类”。
    LPTSTR可以自动转换为LPCTSTR
    LPCTSTR只能强制转换为LPTSTR
    CString只所以和他们有千丝万缕的关系
    是因为CString有支持LPTSTR和LPCTSTR的构建函数、赋值符重载等等
    再说就说到C++是怎么回事了。
    我的建议是:你还需要学习C/C++,不是温习。
    然后再看看CString的头文件,你都知道为什么它那么神奇了。
      

  8.   

    加分不用了
    反正我也是过过侃瘾,哈哈
    希望对你有所帮助就好
    如果你要用臭鸡蛋砸我,通知一下
    我换衣服先,我现在可是穿的新衣服
    不过我感觉你的根本原因还是C/C++的基础不牢
    才出这样的问题
    我以前学C++是看的一本台湾的专门讲C++的书
    好象当时还是用的Borland C++ 3.1
    具体书名忘了。