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 参照を介して=演算子に渡すことはできません。このコードをコンパイルできた場合、それは単にコンパイラがそれを言語の「拡張」として受け入れたことを意味します。

その特定のエラーを修正するには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::stringfor storage を使用する方がはるかに良い場合があります。ename(特にそのように依頼された場合を除きます)。

于 2012-12-25T20:25:48.847 に答える