当前位置: 首页 > 知识库问答 >
问题:

c++ - C++中实现[]重载报错?

阮轶
2023-11-05

在visual_studio中想做一个[]重载的小练习,

#include <cstring>#include <iostream>using namespace std;struct Person{    double salary;    char *name;};class SalaryManage{private:    Person *employ;    int max;    int n;public:    SalaryManage(int Max = 0)        :max(Max),n(0),employ(new Person[max])    {    }    double  &operator[](char *Name)     {        Person *p;        for (p = employ;p < employ + n;p++)            if (strcmp(p->name, Name) == 0)                return p->salary;        p = employ + n++;        p->name = new char[strlen(Name) + 1];        strcpy(p->name, Name);        p->salary = 0;        return p->salary;    }    void display()    {        for (int i = 0;i < n;i++)            cout << employ[i].name << "  " << employ[i].salary << endl;    }    ~SalaryManage()    {        delete[] employ;    }};int main(){    SalaryManage s(3);    s["张三"]  = 2188.88;    s["里斯"] = 1234.65;    s["王五"] = 3200.98;    cout << "张三\t" << s["张三"] << endl;    cout << "里斯\t" << s["里斯"] << endl;    cout << "王五\t" << s["王五"] << endl;    s.display();}

可是主函数部分显示
image.png

作为C++新手,请大佬们帮忙指点一二

共有1个答案

左丘昊天
2023-11-05

这个错误是由于您在 SalaryManage 类的 operator[] 中没有正确地处理数组越界的情况。当您没有找到与 Name 匹配的名称时,您创建了一个新的 Person 对象并将其添加到数组的末尾,但您没有更新 n 的值,这导致在尝试访问不存在的数组索引时出现错误。

为了解决这个问题,您应该在添加新 Person 对象后将 n 的值增加 1。这样,您就可以正确地访问新添加的元素。此外,您应该在 display 函数中更新数组的长度。以下是更正后的代码:

#include <cstring>#include <iostream>using namespace std;struct Person{ double salary; char *name;};class SalaryManage{private: Person *employ; int max; int n;public: SalaryManage(int Max = 0) :max(Max),n(0),employ(new Person[max]) { } double& operator[](const char* Name)  { Person *p = nullptr; for (int i = 0; i < n; i++) { if (strcmp(employ[i].name, Name) == 0) { p = &employ[i]; break; } } if (p == nullptr) { p = &employ[n++]; p->name = new char[strlen(Name) + 1]; strcpy(p->name, Name); p->salary = 0; } return p->salary; } void display() const { for (int i = 0; i < n; i++) cout << employ[i].name << "  " << employ[i].salary << endl; } ~SalaryManage() { delete[] employ; }};int main(){ SalaryManage s(3); s["张三"]  = 2188.88; s["里斯"] = 1234.65; s["王五"] = 3200.98; cout << "张三\t" << s["张三"] << endl; cout << "里斯\t" << s["里斯"] << endl; cout << "王五\t" << s["王五"] << endl; s.display();}
 类似资料:
  • 在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。 类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后, 这个对对象进行强制类型转换的表达式就等价于 ,即变成对运算符函数的调用。 下面的程序对 double 类型强制转换运算符进行了重载。 程序的输出结果是: 1.2 3.2 第 8 行对 double 运算符进行

  • C++ 规定,下标运算符 必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下: 返回值类型 & operator[ ] (参数); 或者: const 返回值类型 & operator[ ] (参数) const; 使用第一种声明方式, 不仅可以访问元素,还可以修改元素。使用第二种声明方式, 只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const

  • C ++允许您为同一范围内的function名称或operator指定多个定义,分别称为function overloading和operator overloading 。 重载声明是声明,声明与同一作用域中先前声明的声明具有相同的名称,除了两个声明具有不同的参数和明显不同的定义(实现)。 当您调用重载function或operator ,编译器通过将用于调用函数或运算符的参数类型与定义中指定的

  • 本文向大家介绍C#中WebClient实现文件下载,包括了C#中WebClient实现文件下载的使用技巧和注意事项,需要的朋友参考一下 鉴于各种复杂的网络环境,笔者决定采用不同的编程接口进行下载尝试,以增加程序的可用性。 这里仅介绍使用 WebClient 的方法,后续的文章会介绍其他的方法。博文中主要介绍思路和关键代码,完整的 demo 附在文末。 使用代理访问网络 很多公司的员工都是通过公司设

  • 自增 和自减 都是一元运算符,它的前置形式和后置形式都可以被重载。请看下面的例子: 运行结果: s1: 00:00 s2: 00:01 s1: 00:01 s2: 00:01 上面的代码定义了一个简单的秒表类,m_min 表示分钟,m_sec 表示秒钟,setzero() 函数用于秒表清零,run() 函数是用来描述秒针前进一秒的动作,接下来是三个运算符重载函数。 先来看一下 run() 函数的实

  • 主要内容:重载输入运算符>>,重载输出运算符<<,综合演示在 C++中,标准库本身已经对左移运算符 和右移运算符 分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面