我现在出现这种问题~~
我派生了一个新类CMyString 派生自CString
但是现在出现问题就是 好象CSTRING类的 operator+ 不能继承
////////////////////////////////////////////////////////////////////////////
class CMyString:public CString
{public:
    CMyString();
    CMyString(char *p);
   // CString operator +( CString str1);};
///////////////////////////////////////////////////////////////////////////
如果  CMyString aaa,bbb,ccc;
aaa="aaa";bbb="bbb";ccc="ccc";
aaa.Insert(2,"hhh");
这个是可以成功的。但是ccc=aaa+bbb;
就会出现错误!是不是必须要重载运算符才可以使用?我有点笨还不会写重载代码 请各位大侠帮帮我写一个重载运算符号我好学习学习 谢谢了

解决方案 »

  1.   

    它是友元函数
    用得了这么麻烦吗,用标准C函数就可以解决。
    strcpy((LPCTSTR)ccc, (LPCTSTR)aaa);
    strcat((LPCTSTR)ccc, (LPCTSTR)bbb);
      

  2.   

    不用写道类里面,放到全局空间吧
    CString &operator+(CMyString &str,CMyString &str1)
    {
    str=str+str1;
    return str;
    }//str为你要声明的CMyString对象的引用;
      

  3.   

    可能还是得重载+号,因为CString中的operator+,他们的参数是CString
    而你现在+号两边的是CMYString,所以还得重载一个
    CMyString operator +( CMyString str1);
      

  4.   

    看了看CString的operator+的代码
    是这样的CString operator+(const CString& string1, const CString& string2)
    {
    CString s;
    s.ConcatCopy(string1.GetData()->nDataLength, string1.m_pchData,
    string2.GetData()->nDataLength, string2.m_pchData);
    return s;
    }那么既然你的mystring是继承于CString的那么
    你把CString换成CMyString
    写一个试试还有,这个函数是个友元
      

  5.   

    另外,由于有赋值的操作,所以operator=也要重载一下
    const CString& CString::operator=(const CString& stringSrc)
    {
    if (m_pchData != stringSrc.m_pchData)
    {
    if ((GetData()->nRefs < 0 && GetData() != _afxDataNil) ||
    stringSrc.GetData()->nRefs < 0)
    {
    // actual copy necessary since one of the strings is locked
    AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
    }
    else
    {
    // can just copy references around
    Release();
    ASSERT(stringSrc.GetData() != _afxDataNil);
    m_pchData = stringSrc.m_pchData;
    InterlockedIncrement(&GetData()->nRefs);
    }
    }
    return *this;
    }这是CString的operator,你一样可以改一下拿来用但问题是既然你的类是继承了CString的,那么一定有你自己新定义的类成员
    比如一个int 型的int a
    那么在你operator+和operator=的时候,是不是也考虑也做一些相应的操作,把这个成员也进行+和赋值操作!
      

  6.   

    谢谢大家 我还有一点疑问 就是 :
    我的派生类
    CMyString aa("dddd"),bb("ffff");
    aa="aaa"+bb;
    这样会出现错误 :
    error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CString' (or there is no acceptable conversion)
    请问各位怎么办呢
      

  7.   

    重载了 如果aa=aa+bb;//就是正常  
    如果aa="aaa"+bb;//就会显示上面的错误。
    还有我这个类如果做好了 我想在其它程序用 问什么是必须加入工程才可以用 不可以象#INCLDUE“”
    这个样子吗?
    是不是必须写如DLL才可以再其它的类里面调用啊~~
    谢谢~~~
      

  8.   

    你不是新建了一个类吗,那么你要用这个类
    定义这个类的头文件得加入你的工程
    比如你这个可能是MyString.h要包含进去不一定非要dll,只要你如果你这个工程包含这个类可以用的
    但是如果你要多个工程都要用到这个类,那么用dll就比较好了至于那个错误
    你定义了CMyString(char *p)或者CMyString(const char *p)
    这样的构造函数了吗??
      

  9.   

    如果还是不对,再添加两个operator+的重载CString operator+(const CString& string, LPCTSTR lpsz)
    {
    ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
    CString s;
    s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData,
    CString::SafeStrlen(lpsz), lpsz);
    return s;
    }CString operator+(LPCTSTR lpsz, const CString& string)
    {
    ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
    CString s;
    s.ConcatCopy(CString::SafeStrlen(lpsz), lpsz, string.GetData()->nDataLength,
    string.m_pchData);
    return s;
    }老规矩,把CString换成CMyString
      

  10.   

    类好了,包含进h,cpp文件进入工程,然后调用的地方包含h文件,申明类,就可以了