0

我试图在我的代码中重载“+”和“=”运算符,但我不断收到运行时错误,并且程序在使用 VS2012 运行时崩溃,但在 borland C 3.1 中完美运行。

这是我的代码:

class employee{
    int eid;
    long esalary;
    char * ename;
    static char company_name[20];
    static int emp_count;

    public:

    static char * getcompanyname(){
        return company_name;
    }
    static int getempcount(){
        return emp_count;
    }
    void set(int empid);
    void set(long empsalary);
    void set(char empname[]);
    int getid();
    long getsalary();
    char * getname();
    employee(int empid=0,long empsalary=0,char empname[]="NA"){
        eid=empid;
        esalary=empsalary;
        ename=new char[strlen(empname)+1];
        strcpy(ename,empname);
        emp_count++;
    }

    employee(employee &ref){
        eid=ref.eid;
        esalary=ref.esalary;
        ename=new char(strlen(ref.ename)+1);
        strcpy(ename,ref.ename);
    }

    ~employee(){
        delete(ename);
    }

    employee operator+(employee &ref){
        employee temp(*this);
        temp.esalary=esalary+ref.esalary;
        return(temp);
    }
    employee& operator= (employee &ref){
        eid=ref.eid;
        esalary=ref.esalary;
        return * this;
    }

}e1,e2,emp;

然后主要:

emp=e1+e2;
4

1 回答 1

3

老实说,您的代码无效。它甚至不应该编译,因为它违反了引用绑定规则:+操作符返回一个临时对象,它不能通过非常量引用传递给=操作符。如果您设法编译了此代码,则仅意味着您的编译器接受它作为语言的“扩展”。

要修复该特定错误,您必须在声明中添加一堆const限定符

employee operator +(const employee &ref) const {
  employee temp(*this);
  temp.esalary = esalary + ref.esalary;
  return temp;
}

employee& operator =(const employee &ref){
  eid = ref.eid;
  esalary = ref.esalary;
  return *this;
}

从 C++ 的角度来看,这将使您的代码有效,但它可能无法修复崩溃,因为崩溃的原因必须在其他地方。


这是导致崩溃的错误:在复制构造函数中,您执行了此操作

ename=new char(strlen(ref.ename)+1);

当你用 分配一个数组时new,你必须使用[]方括号,而不是()

ename = new char[strlen(ref.ename) + 1];

你在你的第一个构造函数中正确地做到了,但是由于某种原因你在你的复制构造函数中使用()了它。在这种情况下意味着完全不同的东西:它分配一个单一的并将其初始化为值。[]()charstrlen(ref.ename) + 1

ename顺便说一句,您没有在复制分配运算符中复制是有原因的吗?

此外,分配的内存new[]必须使用delete[]. 不是与delete,而是与delete[]。这就是你的析构函数应该是什么样子

~employee() {
  delete[] ename;
}

std::string最后,使用for storage可能会好得多ename,而不是依赖原始内存管理。(除非您被特别要求这样做)。

于 2012-12-25T20:25:48.847 回答