【问题标题】:overloading parenthesis operator for Set() and Get()Set() 和 Get() 的重载括号运算符
【发布时间】:2012-04-28 20:03:28
【问题描述】:

指令是:

MyString 对象应重载以下运算符:

1) 应该重载括号运算符以替换之前赋值的 Set 和 Get 函数。请注意,两个实例都应在违反字符串数组边界时发出 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];

    }
}

我做错了什么?

【问题讨论】:

  • 什么不正常?你得到一个编译错误?运行时崩溃?
  • 这将是 akward 使用。你会喜欢b(1,5); operator[] 来达到同样的目的。
  • 这是我收到的错误之一错误:在â((MyString*)this)->MyString::String[index]â 中不匹配âoperator[]â ??

标签: c++ string object operator-overloading


【解决方案1】:

您的边界检查是错误的,但您在原始代码中已经遇到了这个问题。

您的index 参数神秘地将类型从int 更改为const MyString&,看起来不对。

【讨论】:

  • 所以应该改成 const int index 吧?
  • 是的,这将非常有帮助。
  • 太棒了!我在上面做了一些更改,你能告诉我其他看起来完全错误的地方吗?
  • @user1363061:边界检查仍然完全错误。如果index 超出范围,则String[index] 将失败,您无法将其与某物进行比较。
【解决方案2】:

Get 和 Set 以及 () 运算符的两个重载都以不适当(错误!)的方式检查字符串外错误。请注意,如果字符串不是那么长,则字符串的第 i 个或第 n 个元素不能是 '\0'。如果您尝试读取超出当前字符串长度的内存,您可能会遇到读取访问冲突。

相反,您应该检查给定的索引是否小于字符串的长度,如果是,则返回该元素。否则,超出范围。

另一件事是,在 () 运算符的第一次重载中,您使用的是字符串对象来取消引用字符串数组,这没有多大意义。此外,b 应该是一个字符,而不是字符串,因为您只设置一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2011-12-03
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多