首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 小疑点,不知道为什么会出现这样的有关问题

2013-08-16 
C++ 小问题,不知道为什么会出现这样的问题#include string#include iostreamusing namespace stdclas

C++ 小问题,不知道为什么会出现这样的问题


#include <string>
#include <iostream>
using namespace std;

class X
{
private:
    int len;
    char * ptr;

public:
    ~X()
    {
        delete ptr;
    }
    int GetLen()
    {
        return len;
    }
    char * GetPtr()
    {
        return ptr;
    }
    X & Set(char *);
    X & Cat(char *);
    X & Copy(X &);
    void Print();    
};

X & X::Set(char * pc)
{
    len = strlen(pc);
    ptr = new char[len + 1];
    strcpy(ptr, pc);
    return * this;
}


X & X::Cat(char * pc)
{
    len += strlen(pc);
    strcat(ptr, pc);
    return * this;
}


X & X::Copy(X & x)
{
    Set(x.GetPtr());
    return * this;
}

void X::Print()
{
    cout << len << "\t" << ptr << endl;
}

int main(void)
{
    X xobj1;

    xobj1.Set("abcd");//xobj1.Set("abcd").Cat("efgh");

    xobj1.Print();

    cin.get();
    return 0;
}


//如果换成main函数中的注释掉的那一行就会有运行时错误, 跟踪了一下是因为析构函数里的delete语句.
//我知道new 和 delete 应该在同一层中比较好, 但这段程序这么写,我感觉应该是没问题的?为什么会有这样的问题
//还有就是为什么main函数中换做没有注释掉的就没有问题,换做注释掉的就有问题了? 也就是为什么调用Cat会有问题?
C++


[解决办法]


#include <string>
#include <iostream>
using namespace std;

class X
{
private:
    int len;
    char * ptr;

public:
      //1
X():len(0), ptr(NULL){}
    ~X()
    {
        delete []ptr;
    }
    int GetLen()
    {
        return len;
    }
    char * GetPtr()
    {
        return ptr;
    }
    X & Set(char *);
    X & Cat(char *);
    X & Copy(X &);
    void Print();    
};

X & X::Set(char * pc)
{
    //2
    len = strlen(pc);
    delete [] ptr;
    ptr = new char[len + 1];
    strcpy(ptr, pc);
    return *this;
}


X & X::Cat(char * pc)
{
   //3
    len += strlen(pc);
char *p = ptr;
ptr = new char[len + 1];
strcpy(ptr, p);
    strcat(ptr, pc);
ptr[len] = 0;
delete []p;
    return * this;
}


X & X::Copy(X & x)
{
    Set(x.GetPtr());
    return * this;
}

void X::Print()
{
    cout << len << "\t" << ptr << endl;
}

int main(void)
{
    X xobj1;

    xobj1.Set("abcd").Cat("efgh");

    xobj1.Print();

    //cin.get();
    return 0;
}


改了3处

热点排行