注册 登录
编程论坛 C++教室

自定义String类,代码哪错了

zheng3912930 发布于 2012-07-19 21:13, 554 次点击
#include<iostream>
using namespace std;
class String{
    private:
    char * m_Data;
    public:
    String(const char * s=NULL );
    String(const String & s);
    String & operator =(const char *);
    friend ostream& operator <<(ostream &stream,String str);
    ~String();
};
String::String(const char * s)
{
    if(s==NULL)
    {
        m_Data=new char[1];
        m_Data='\0';
    }
    else
    {
        int len=strlen(s);
        m_Data=new char[len+1];
        strcpy(m_Data,s);
    }
}
String::String(const String &s)
{
    /*if(*this==s)
      return s;
    else
    {*/
    int length=strlen(s.m_Data);
    m_Data=new char[length+1];
    strcpy(m_Data,s.m_Data);
}

String & String::operator =(const char *s)
{
    if(s==NULL)
    {
        m_Data=new char[1];
        m_Data='\0';
    }
    else
    {
        int len=strlen(s);
        m_Data=new char[len+1];
        strcpy(m_Data,s);
    }
   
}
String::~String()
    {
        delete [] m_Data;
    }
ostream& operator <<(ostream &stream,String str)
{
    stream<<str.m_Data;
    return stream;
}
int main()
{
    String s;
    String s1("nihao!");
    String s2(s1);
    String s3="en!";
    cout<<s1<<' '<<s2<<endl;
    cout<<s3;
    return 0;
}(为什么有错误)
C:\Documents and Settings\Administrator\cq.cpp(59) : error C2248: 'm_Data' : cannot access private member declared in class 'String'
        C:\Documents and Settings\Administrator\cq.cpp(5) : see declaration of 'm_Data'
C:\Documents and Settings\Administrator\cq.cpp(68) : error C2593: 'operator <<' is ambiguous
C:\Documents and Settings\Administrator\cq.cpp(69) : error C2593: 'operator <<' is ambiguous
3 回复
#2
rjsp2012-07-20 08:27
首先,换个编译器,这是最重要的。

关于代码的错误
1。缺少#include <cstring>
别说某个编译器中有了#include <iostream>就行,C++标准可没有这么规定
2。friend ostream& operator <<(ostream &stream,String str);
改为 friend ostream& operator <<(ostream &stream, const String& str);
否则多一次拷贝赋值
3。String & String::operator =(const char *s) 中原本的m_Data指向的内存没得到释放,且缺少return *this;
4。缺少String& String::operator=(const String& s),将会进行浅拷贝
#3
pangding2012-07-20 21:35
rjsp 果然既认真又敬业。
#4
一只小蚂蚁2012-07-22 01:16
默认构造指针给NULL吧 申请一字节空间何必呢
1