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处
