#include <cstring>
#include <iostream>
using namespace std;
class String{
public:
String(const char* p){
sz = strlen(p);
data = new char[sz + 1];
strcpy(data, p);
}
~String() { delete[] data; }
operator char*() { return data; }
private:
int sz;
char* data;
};
int main(int argc, char const *argv[])
{
const char* p = "helloworld";
String s(p);
if(s)
cout << s << endl;
return 0;
}
以上有operator char*的返回值被交由用户去承担,这就是设计的不合理处。
第二版设计:
class String{
public:
String(const char* p){
sz = strlen(p);
data = new char[sz + 1];
if(data == 0)
error();
else
strcpy(data, p);
}
~String() { delete[] data; }
operator char*() { return data; }
private:
int sz;
char* data;
};
class String{
public:
String(const char* p){
sz = strlen(p);
data = new char[sz + 1];
if(data == 0)
error();
else
strcpy(data, p);
}
~String() { delete[] data; }
int valid() { return data != 0; }
operator char*() { return data; }
private:
int sz;
char* data;
};
第四版设计:
#include <cstring>
#include <iostream>
using namespace std;
class String{
public:
String(const char* p){
sz = strlen(p);
data = new char[sz + 1];
if(data == 0)
throw bad_alloc();
else
strcpy(data, p);
}
~String() { delete[] data; }
operator char*() { return data; }
private:
int sz;
char* data;
};
int main(int argc, char const *argv[])
{
const char* p = "helloworld";
try{
String s(p);
cout << s << endl;
}catch(bad_alloc){
return -1;
}
return 0;
}
这样的方式使用异常会极大地简化我们的程序,因为只要String存在,就能保证已经成功分配了String的内存。所以,不用在String类的别的地方检查内存耗尽了。