Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的错误+;重载运算符时的代码_C++_Class_Operator Overloading_Operator Keyword - Fatal编程技术网

C++ C+中的错误+;重载运算符时的代码

C++ C+中的错误+;重载运算符时的代码,c++,class,operator-overloading,operator-keyword,C++,Class,Operator Overloading,Operator Keyword,我试图在我的代码中重载“+”和“=”运算符,但在使用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 * getcompan

我试图在我的代码中重载“+”和“=”运算符,但在使用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;

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

要修复该特定错误,必须在声明中添加一组
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
分配数组时,必须使用
[]
括号,而不是
()

您在第一个构造函数中正确地执行了该操作,但由于某种原因,您在副本构造函数中使用了
()
而不是
[]
()
在这个上下文中意味着完全不同的东西:它分配一个
字符
,并将其初始化为
strlen(ref.ename)+1

顺便问一下,您不在复制分配操作符中复制
ename
有什么原因吗

另外,使用
new[]
分配的内存必须通过
delete[]
释放。不是使用
delete
,而是使用
delete[]
。这就是析构函数的外观

~employee() {
  delete[] ename;
}


最后,您最好使用
std::string
来存储
ename
,而不是依赖原始内存管理。(除非特别要求您这样做)。

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

要修复该特定错误,必须在声明中添加一组
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
分配数组时,必须使用
[]
括号,而不是
()

您在第一个构造函数中正确地执行了该操作,但由于某种原因,您在副本构造函数中使用了
()
而不是
[]
()
在这个上下文中意味着完全不同的东西:它分配一个
字符
,并将其初始化为
strlen(ref.ename)+1

顺便问一下,您不在复制分配操作符中复制
ename
有什么原因吗

另外,使用
new[]
分配的内存必须通过
delete[]
释放。不是使用
delete
,而是使用
delete[]
。这就是析构函数的外观

~employee() {
  delete[] ename;
}


最后,您最好使用
std::string
来存储
ename
,而不是依赖原始内存管理。(除非特别要求您这样做)。

请发布VS2012的运行时错误信息。另外,请考虑修改题目的标题,以更具体的方式来反映问题的答案。你在课堂上超载了吗?最后一行是在哪里生成的呢?PS:实现是在类中定义的……最后一行在主函数中,
operator[]
是如何重载的?也许如果您再给我们看一点代码,例如,e[]来自哪里?Borland C,你在DOS中跑步吗?在这种情况下,您可能不会发生崩溃,只是在超出分配内存的情况下出现了奇怪的行为。如果e[]有三个元素,则e[3]无效!请发布VS2012的运行时错误信息。另外,请考虑修改题目的标题,以更具体的方式来反映问题的答案。你在课堂上超载了吗?最后一行是在哪里生成的呢?PS:实现是在类中定义的……最后一行在主函数中,
operator[]
是如何重载的?也许如果您再给我们看一点代码,例如,e[]来自哪里?Borland C,你在DOS中跑步吗?在这种情况下,您可能不会发生崩溃,只是在超出分配内存的情况下出现了奇怪的行为。如果e[]有三个元素,则e[3]无效!我复制了EnMeNe,但我删除它,因为我认为它是错误源……抱歉,但是STD::String?@ Mazen:<代码> STD::String 是C++标准库提供的类。它用于存储字符串值。它负责内部的所有内存管理,这样您就不必自己做了。我复制了EnMeNe,但我删除它,因为我认为它是错误源……抱歉,STD::String?@ Mazen:<代码> STD::String 是C++标准库提供的类。它用于存储字符串值。它在内部负责所有的内存管理,因此您不必自己做。