2017-11-22 11 views
-5

割り当て担当者に問題があります。赤い下線のエラーはありませんが、私はプログラムがmain.cppに中アクセス違反書き込み場所0x00000028

emp1 = emp2; 

で壊れるコンパイルするとき、私は代入演算機能を追加するまで、すべてが働いていました。

何かアドバイスをいただければ幸いです。

編集:ちょうど全体の問題ではなく、問題に関連する特定のコードを表示する必要があると思った。ここで

は、私が書いたものだ:

ListOfEmp.h

public: 
    ListOfEmp(); 
    ListOfEmp(const ListOfEmp &); 
    ~ListOfEmp(); 
    const ListOfEmp& operator=(const ListOfEmp e); 

}; 

ListOfEmp.cpp

ListOfEmp::ListOfEmp():head(NULL) 
{ 
} 

ListOfEmp::ListOfEmp(const ListOfEmp &e) { 
    *this = e; 
} 

ListOfEmp::~ListOfEmp() 
{ 
    clear(); 
} 


const ListOfEmp& ListOfEmp::operator=(const ListOfEmp e){ 
    if (this != &e) { 
     clear(); 
     EmpNode* copy = NULL; 
     EmpNode* orig = e.head; 
     while (orig != NULL) { 
      if (head = NULL) { 
       head = copy = new EmpNode((orig->emp).name, (orig->emp).salary); 
      } 
      else { 
       copy->next = new EmpNode((orig->emp).name, (orig->emp).salary); 
       copy = copy->next; 
      } 

      orig = orig->next; 
     } 
    } 
    return *this; 
} 

void ListOfEmp::clear() { 
    EmpNode* temp = head; 
    while (temp != NULL) { 
     temp = temp->next; 
     delete head; 
     head = temp; 
    } 
} 

MAIN.CPP

int main() { 
    ListOfEmp emp1; 
    emp1.insertAtfront("John", 20000.00); 
    emp1.insertAtfront("Dave", 24500.50); 
    emp1.insertAtfront("Joshua", 33567.60); 
    emp1.deleteMostRecent(); 
    emp1.getSalary("Dave"); 
    cout << endl; 
    cout << emp1; 
    cout << endl; 

    ListOfEmp emp2; 
    emp2.insertAtfront("Julio", 54000.00); 
    emp2.insertAtfront("Mike", 12000.00); 
    emp2.getSalary("Mike"); 
    cout << endl; 
    cout << emp2; 
    cout << endl; 
    emp1 = emp2; 
    cout << emp1; 
    cout << endl; 
    cout << emp2; 
    system("pause"); 
} 
+1

コピーコンストラクタの '* this = e;'は、風に対して100マイルのにおいをします。 – user0042

+0

説明できますか?私はこれが私がコピーコンストラクタのために書いたはずのものだと思った。 – Kujinn

+0

あなたの 'operator = 'がいかに良いかによって変わります。従来の知恵は、コピーコンストラクタに基づいて '= 'を使用して逆のやり方をすることです。それを読んで:[コピーとスワップのイディオムは何ですか?](https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)重いですが、それは常に動作し、それは金の重さの価値がある。 – user4581301

答えて

1
ListOfEmp::ListOfEmp(const ListOfEmp &e) { 
    *this = e; 
} 

割り当て演算子の周囲にコピーコンストラクタを使用します。残念ながら、代入演算子

const ListOfEmp& ListOfEmp::operator=(const ListOfEmp e){ 
    ... 
} 

は、代入演算子を呼び出すコピーコンストラクタを呼び出す代入演算子を呼び出すコピーコンストラクタを呼び出す代入演算子を呼び出すコピーコンストラクタを呼び出す、値によって割り当てられるListOfEmpを取りますコピーコンストラクタを呼び出す。

未制御の再帰。

ソリューションは、基準

const ListOfEmp& ListOfEmp::operator=(const ListOfEmp & e){ 
    ... 
} 

によってパスとever-popular Copy and Swap Idiomを利用する他の方法で回避、コピーコンストラクタに基づいて、代入演算子、書き換えています。

あなたが最初のオプションで行く場合は、代入演算子を注意しては過度に複雑であり、ロジックエラー

if (head = NULL) // Whoops. Annihilated head! Should be head == NULL 

があり、不完全なコードが提供されていないコードで他のエラーの余地を残します。

scohe001も、コピーコンストラクタでheadが初期化されていないことに注意してください。これは、クラッシュを誘発している間違いではない可能性が高いです。

+0

最初のオプションを使用して参照渡しと(head = NULL)の問題を修正すると同時に、私はまだ同じだがわずかに異なるエラーが発生しています。おそらく、私が使った方法は、コピーとスワップイディオムのリンクと比べて非効率です。私はコードを書き直し、それがこの問題を解決するのに役立つかどうかを見てみましょう。 – Kujinn

+0

@Kujinnここで戦争で効率的な2つのタイプ。コピーとスワップは実際には少し遅くなりがちですが、そうすることで効率が低下します。しかし、その偉大な栄光は、書いたり、誤って使うのが難しくなっているため、書き込み、デバッグ、および保守する方がはるかに効率的です。 – user4581301

0

OPの質問とその助けになるほどの価値のある答えを読んだが、OPの欠点があるため、回答が不足しているのは、最小、完全、&の例があると思います。

送信されなかった送信元からコミュニティには見えない、他に見えない問題や言語固有の文法上の誤り。

関連する問題