为何《C++/C试题的答案与评分标准》的String我无法编译?

风里有梦 2005-10-16 05:52:15
请教大哥,我是C程序员,对C++不了解,可是对OO懂一点皮毛。为何林瑞博士的《C++/C试题的答案与评分标准》里的String我无法编译通过?一用cl.exe /c /Gz /O2 string.cpp就出现了60多个错误。。。

--------------------------------------------------------------------------------
class String

{

public:

String(const char *str = NULL); // 普通构造函数

String(const String &other); // 拷贝构造函数

~ String(void); // 析构函数

String & operate =(const String &other); // 赋值函数

private:

char *m_data; // 用于保存字符串

};

// String的析构函数

String::~String(void) // 3分

{

delete [] m_data;

// 由于m_data是内部数据类型,也可以写成 delete m_data;

}



// String的普通构造函数

String::String(const char *str) // 6分

{

if(str==NULL)

{

m_data = new char[1]; // 若能加 NULL 判断则更好

*m_data = ‘\0’;

}

else

{

int length = strlen(str);

m_data = new char[length+1]; // 若能加 NULL 判断则更好

strcpy(m_data, str);

}

}

// 拷贝构造函数

String::String(const String &other) // 3分

{

int length = strlen(other.m_data);

m_data = new char[length+1]; // 若能加 NULL 判断则更好

strcpy(m_data, other.m_data);

}

// 赋值函数

String & String::operate =(const String &other) // 13分

{

// (1) 检查自赋值 // 4分

if(this == &other)

return *this;



// (2) 释放原有的内存资源 // 3分

delete [] m_data;



// (3)分配新的内存资源,并复制内容 // 3分

int length = strlen(other.m_data);

m_data = new char[length+1]; // 若能加 NULL 判断则更好

strcpy(m_data, other.m_data);



// (4)返回本对象的引用 // 3分

return *this;

}
...全文
230 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
风里有梦 2005-10-16
  • 打赏
  • 举报
回复
以上各位都是大哥啦!THKS~~ ^_^

没想到源文件的代码也有问题啊
v41dugu 2005-10-16
  • 打赏
  • 举报
回复
程序员才是大哥~~~
v41dugu 2005-10-16
  • 打赏
  • 举报
回复
呵呵 :) 我是小弟~~
风里有梦 2005-10-16
  • 打赏
  • 举报
回复
呵呵,多谢楼上的几位大哥!我已搞定了。^_^
v41dugu 2005-10-16
  • 打赏
  • 举报
回复
CStr& opterate =(const CStr& other); // 赋值函数
重载应该是operator不是你写的这个啊。。。。
v41dugu 2005-10-16
  • 打赏
  • 举报
回复
你说说你报的什么错?windows.h有什么用哦 你应该用string.h才对呀 C里面也是这样用的呀
风里有梦 2005-10-16
  • 打赏
  • 举报
回复
刚刷新,不好意思没看到elangqzy的回复,先谢,我试试。^_^
风里有梦 2005-10-16
  • 打赏
  • 举报
回复
v41dugu的类我能编译,为什么我的就不行啊?大家帮我看看:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#include <iostream.h>
#include <string.h>

class CStr
{
public:
CStr(const char* str = NULL); // 普通构造函数
CStr(const CStr& other); // 拷贝构造函数
~CStr(void); // 析构函数
CStr& opterate =(const CStr& other); // 赋值函数

private:
char* m_data;

};

// 析构函数
CStr::~CStr(void)
{
delete []m_data;
}

// 普通构造函数
CStr::CStr(const char* str)
{
if ( str == NULL )
{
m_data = new char[1];
*m_data = TEXT('\0');
}
else
{
m_data = new char[strlen(str)];
strcpy(m_data, str);
}
}

// 拷贝构造函数
CStr::CStr(const CStr& other)
{
m_data = new char[strlen(other.m_data)];
strcpy(m_data, other.m_data);
}

// 赋值函数
CStr& CStr::opterate =(const CStr& other)
{
if ( this == &other )
return *this;

delete []m_data;

m_data = new char[strlen(other.m_data)]
strcpy(m_data, other.m_data);

return *this;
}

int main(void)
{
printf("ok");
return (0);
}
elangqzy 2005-10-16
  • 打赏
  • 举报
回复
搂主程序中运算符重载操作符写错了operate->operator;
程序本身没有错,改过后可以编过去的。
doway 2005-10-16
  • 打赏
  • 举报
回复
#include <string.h>

class String
{
public:
String(const char* str = NULL); // 普通构造函数
String(const String& other); // 拷贝构造函数
~String(); // 析构函数

String& operator=(const String& other); // 赋值函数

private:
char* m_data; // 用于保存字符串
};

// String的析构函数
String::~String() // 3分
{
delete [] m_data; // 由于m_data是内部数据类型,也可以写成 delete m_data;
}

// String的普通构造函数
String::String(const char* str) // 6分
{
if(str==NULL)
{
m_data = new char[1]; // 若能加 NULL 判断则更好
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1]; // 若能加 NULL 判断则更好
strcpy(m_data, str);
}
}

// 拷贝构造函数
String::String(const String& other) // 3分
{
int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加 NULL 判断则更好
strcpy(m_data, other.m_data);
}

// 赋值函数
String& String::operator=(const String& other) // 13分
{
// (1) 检查自赋值 // 4分
if(this == &other)
return *this;

// (2) 释放原有的内存资源 // 3分
delete [] m_data;

// (3)分配新的内存资源,并复制内容 // 3分
int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加 NULL 判断则更好
strcpy(m_data, other.m_data);

// (4)返回本对象的引用 // 3分
return *this;
}

也在学习中,帮你改好了,cl /c string.cpp 即可。

主要错误有:
~ String 多了个空格
operate 应为 operator
单引号是中文字符
风里有梦 2005-10-16
  • 打赏
  • 举报
回复
不好意思,上面的是拷贝的。*^_^*
不过我自己昨天测试的时候,是自己一句一句打上去的。

没加#include <string.h>啊!不过有:

#include <windows.h>



v41dugu 2005-10-16
  • 打赏
  • 举报
回复
我自己写的个 你可以参考一下
#include <iostream.h>
#include <string.h>
class Mystring
{
char *p;
public:
Mystring(char * =NULL); // 构造
Mystring (const Mystring &); //拷贝构造
~Mystring();
Mystring &operator = (Mystring &); //几个重载函数。。。。。。
Mystring operator + (Mystring &);
Mystring &operator +=(Mystring &);
char operator [] (int);
Mystring &operator () (int,int);
friend ostream &operator <<(ostream &,Mystring &);
friend istream &operator >>(istream &,Mystring &);

};

Mystring::Mystring(char *p0)
{
if(p0==NULL)
p=p0;
else
{
p=new char [strlen(p0)+1];
strcpy(p,p0);
}
}

Mystring::Mystring(const Mystring &str)
{
if(str.p==NULL)
p=NULL;
else
{
p=new char [strlen(str.p)+1];
strcpy(this->p,str.p);
}
}

Mystring::~Mystring(){delete [] p;}

Mystring &Mystring::operator = (Mystring &str1)
{
if(this!=&str1)
{
delete [] p;
if(str1.p==NULL)
p=NULL;
else
{

p=new char [strlen(str1.p)+1];
strcpy(p,str1.p);
}
}
return *this;
}

Mystring Mystring::operator + (Mystring &str1)
{
if(str1.p==NULL)
return *this;
else
{
if(p==NULL)
return str1;
else
{
char str[256];
strcpy(str,p);
strcat(str,str1.p);
Mystring temp(str);
return temp;
}
}
}

Mystring &Mystring::operator +=(Mystring &str1)
{
if(str1.p==NULL)
return *this;
else
{
if(p!=NULL)
{
char temp[256];
strcpy(temp,p);
delete [] p;
strcat(temp,str1.p);
p=new char [strlen(temp)+1];
strcpy(p,temp);
return *this;
}
else
{
p=new char [strlen(str1.p)+1];
strcpy(p,str1.p);
return *this;
}
}
}

char Mystring::operator [] (int n)
{

int L=strlen(p);
if(n<0||n>=L)
{
cout<<"执行了非法操作\n";
return '\0';
}
else
return this->p[n];
}

Mystring &Mystring::operator () (int start,int len)
{
if(p!=NULL)
{
int L=strlen(p);
if(start<0||len<=0||start+len-1>=L)
{
cout<<"提取字符串操作不合法\n";
Mystring *temp_p=new Mystring;
return *temp_p;
}
else
{

Mystring *temp_p=new Mystring(new char [len+1]);
for(int i=0,j=start;j<=start+len-1;i++,j++)
temp_p->p[i]=p[j];
temp_p->p[i]='\0';
return *temp_p;
}
}
else
{
cout<<"空字符串不能提取\n";
Mystring *temp_p=new Mystring;
return *temp_p;
}
}


ostream &operator <<(ostream &s,Mystring &str1)
{
if(str1.p==NULL)
s<<'\0';
else
s<<str1.p;
return s;

}
istream &operator >> (istream &s,Mystring &str1)
{
if (str1.p!=NULL)
delete[] str1.p;
char buffer[256];
s>>buffer;
str1.p = new char[strlen(buffer)+1];
strcpy(str1.p, buffer);
return s;
}

int main()
{
Mystring str1;
Mystring str2;
Mystring str3;
Mystring str4;
cout<<"请分别输入str1和str2的值\n";
cin>>str1;
cin>>str2;
cout<<"连接str1和str2后的字符串为:";
str3=str1+str2;
cout<<str3<<endl;
cout<<"str2为:"<<str2<<endl;
cout<<"经过str4+=str2计算后str4的值为:";
str4+=str2;
cout<<str4;
cout<<endl;
cout<<"提取str1(0,2)后为:"<<str1(0,2)<<endl;
return 0;
}

v41dugu 2005-10-16
  • 打赏
  • 举报
回复
出现这么多错误很可能是复制上了编译器未知的符号,一般是空白的东西。
doway 2005-10-16
  • 打赏
  • 举报
回复
没看到楼主的 #include <string.h>
v41dugu 2005-10-16
  • 打赏
  • 举报
回复
代码你是粘贴上去的还是自己写上去的?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧