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

string 类的功能

黄昏的王座 发布于 2011-12-01 18:24, 1200 次点击
#include<iostream>
#include<cstring>
using namespace std;
class mystring
{
    public :
        mystring (char *n);
        mystring (int m);
        mystring ();
        mystring (mystring &Mytring);
        mystring &operator = (mystring &Mystring);
        mystring &operator + (mystring &p);
        void display();
        ~mystring();
    private :
        char *N;
        int M;
};
mystring::mystring(char *n)
{
    int len = sizeof(n);
    N = new char[len];
    strcpy(N, n);
}
mystring::mystring(int m)
{
    N = new char[m + 1];
    for (int i = 0; i < m; i++)
        N[i] = ' ';
    N[m] = '\0';
}
mystring :: mystring (mystring &Mystring ){
         M = Mystring.M;
         N = new char [M+1];
         strcpy(N,Mystring.N);
}
mystring::mystring()
{
    M = 1;
    N = new char[M];
    N[0] = '\0';

}
mystring &mystring::operator = (mystring &Mystring){
         M = Mystring.M;
         delete []N;
         N = new char [M+1];
         strcpy(N,Mystring.N);
         return *this;
}
mystring &mystring::operator + (mystring &p)
{
    char *NN;
    int MM = M;
    NN = new char[MM];
    strcpy(NN, N);
    delete []N;
    N = new char[MM + p.M + 1];
    strcpy(N, NN);
    strcat(N, p.N);
    N[MM + p.M] = '\0';
    delete[]NN;
    return *this;
}
void mystring::display()
{
    cout<<"<";
    if (N != NULL)
    cout<<N;
    cout<<">"<<endl;
}
mystring::~mystring()
{
    delete []N;
}
int main()
{
  mystring s1 ("sdfgfdgdf"), s2(5), s3, s4("nzx"), s5("liu"), s6;
  s1.display();
  s2.display();
  s3.display();
  s3 = s1;
  s3.display();
  s6 = s4 + s5;
  s6.display();
  return 0;
}


只有本站会员才能查看附件,请 登录



这是什么原因啊?  我是想编写一个能实现关于string 功能的类函数   可是老是出现这个问题  求大神帮忙看一下  ,  小弟感激不尽
11 回复
#2
我菜1192011-12-01 19:27
int len = sizeof(n);你认为len的值是多少呢?是字符串的长度还是4呢?好好理解一下~!

还有就是要提醒一下:重载+运算符不应改变其中一个类对象中的值!
#3
我菜1192011-12-01 20:01
给你的这段代码改了一下,你写的那代码真是乱七八糟!整个N和M来定义变量,并且那个M还乱七八糟的赋值!
我在改的时候把那个类名改为了CString,变量也改了个比较好的名字,同时我说一下,对运算符+进行重载的时候,不要去改变其中一个类对象中的变量值,这些问题我都给你改了一下!

这是改后的代码:

程序代码:
#include<iostream>
#include<cstring>
using namespace std;

class CString
{
    public :
        CString(char *);
        CString(int);
        CString();
        CString(CString &);
        CString & operator =(CString &);
        CString operator +(CString &);
        void display();
        ~CString();
    private :
        char *pstr;
        int size;
};

CString::CString(char *p)
{
    size = strlen(p);
    pstr = new char[size+1];
    if(pstr)
        strcpy(pstr, p);
}

CString::CString(int len)
{
    size = len;
    pstr = new char[size+1];
    for(int i = 0; i < size; i++)
        pstr[i] = ' ';
    pstr[i] = '\0';
}

CString::CString(CString &cs)
{
    size = cs.size;
    pstr = new char[size+1];
    if(pstr)
        strcpy(pstr, cs.pstr);
}

CString::CString()
{
    size = 1;
    pstr = new char[size];
    pstr[0] = '\0';

}

CString & CString::operator =(CString &cs)
{
    size = cs.size;
    pstr = new char[size+1];
    strcpy(pstr, cs.pstr);
    return *this;
}

CString CString::operator +(CString &cs)
{
    CString temp;
    temp.size =  size + cs.size;
    temp.pstr = new char[strlen(pstr)+strlen(cs.pstr)+1];
    if(temp.pstr)
    {
        strcpy(temp.pstr, pstr);
        strcat(temp.pstr, cs.pstr);
    }
    return temp;
}

void CString::display()
{
    cout<<"<";
    if(pstr)
        cout<<pstr;
    cout<<">"<<endl;
}

CString::~CString()
{
    delete []pstr;
}

int main()
{
    CString s1("sdfgfdgdf"), s2(5), s3, s4("nzx"), s5("liu"), s6;
    s1.display();
    s2.display();
    s3.display();
    s3 = s1;
    s3.display();
    s6 = s4 + s5;
    s6.display();
    return 0;
}

#4
赵春晓2011-12-01 20:21
我想问你用二维堆数组数组怎么实现矩阵的求和?可以告诉我吗?谢谢了
#5
我菜1192011-12-01 20:43
回复 4楼 赵春晓
你问谁?问楼主?
#6
我是菜鸟C2011-12-02 09:16
回复 4楼 赵春晓
直接定义两个二维数组:a[M][N]和b[m][n],然后用两个for循环使得a[i][j]+b[i][j]不就ok了吗???
#7
埋首2011-12-02 13:26
你问的是不是稀疏矩阵啊。
#8
黄昏的王座2011-12-03 11:17
回复 4楼 赵春晓
按照矩阵的运算规则,进行for循环相加就行了
#9
黄昏的王座2011-12-03 11:22
回复 3楼 我菜119
很感谢,谢谢你了啊;  还有一个问题  按照你改写的那种,运行的时候提示
只有本站会员才能查看附件,请 登录
,  如果直接写(s4+s5)就没有错误了 这是什么原因啊 难道是我的编译器的原因  我用的是code:blocks
#10
我菜1192011-12-03 12:46
回复 9楼 黄昏的王座
你说的具体些!
#11
黄昏的王座2011-12-04 21:24
回复 10楼 我菜119
就是那个程序, 如果写的是s6 = s4 + s5; s6.display();就提示出错,但是如果写(s4 + s5).display();就能运行   这个是因为什么 ,  关于运算符重载的问题刚刚接触,所以还有的不太懂  呵呵
#12
我菜1192011-12-04 21:44
你说的这个问题在我的电脑上是不存在的,不知道你用的是什么编译器,具体的你加我的QQ聊!1922761023
1