说明如下:
MyString对象应该重载以下运算符:
1)应重载括号运算符以替换先前赋值的Set和Get函数。请注意,两个实例都应在违反字符串数组bounaries时发出exit(1)。
我的.cpp文件中定义了函数:
// My original set function to replace the character at the index passed in with the character passed in
void MyString::Set(int index, char b)
{
if(String[index] == '\0')
{
exit(1);
}
else
{
String[index] = b;
}
}
//original get function to get the character of the index passed in as argument
char MyString::Get(int i)
{
if( String[i] == '\0')
{
exit(1);
}
else
{
return String[i];
}
}
如何将其转换为重载()运算符函数?我得到的最多是:
MyString& MyString::operator()(const int index, const char b)
{
if(String[index] == '\0')
{
exit(1);
}
else
{
String[index] = b;
}
}
char& MyString::operator()(const int i)
{
if( String[i] == '\0')
{
exit(1);
}
else
{
return String[i];
}
}
我做错了什么?
答案 0 :(得分:3)
您的边界检查错误,但您在原始代码中已经遇到了这个问题。
您的index
参数神秘地更改了从int
到const MyString&
的类型,看起来不对。
答案 1 :(得分:2)
Get和Set,以及()运算符的两个重载以不正确(错误!)的方式检查字符串错误。请参阅,如果字符串不长,则字符串的第i个或第n个元素不能为'\ 0'。如果您尝试读取超出当前字符串长度的内存,则可能会出现读取访问冲突。
相反,您应检查给定索引是否小于字符串的长度,如果是,则返回该元素。否则,它已经超出界限。
另一件事是,在()运算符的第一个重载中,您使用字符串对象取消引用字符串数组,这没有多大意义。另外,b应该是一个字符,而不是字符串,因为你只设置了一个元素。