2017-02-03 3 views
0

自分自身のクラス文字列を作成しようとしています。 オペレータのオーバーロードに関する問題があります。演算子が自分の文字列にオーバーロードする(+ =、=)

My_string.h

#include <cstring> 
    #include <iostream> 
    class My_string 
    { 
    private: 
     char *value; 
    public: 
     My_string(); 
     My_string(char *); 
     ~My_string(); 
     My_string operator +=(const My_string&); 
     My_string operator =(const My_string&); 
     void show()const; 
    }; 

My_string.cpp + =と=演算子をオーバーロードする方法

#include "stdafx.h" 
#include "My_string.h" 


My_string::My_string() 
{ 
    value = new char[1]; 
    strcpy(value, ""); 
} 

My_string::My_string(char * r_argument) 
{ 

    value = new char[strlen(r_argument) + 1]; 
    strcpy(value, r_argument); 
} 

My_string::~My_string() 
{ 
    delete[]value; 
} 

My_string My_string::operator+=(const My_string &r_argument) 
{ 
    char * temp_value = new char[strlen(value) + strlen(r_argument.value) + 1]; 
    strcpy(temp_value, value); 
    strcat(temp_value,r_argument.value); 
    delete[]value; 
    value = new char[strlen(value) + strlen(r_argument.value) + 1]; 
    strcpy(value, temp_value); 
    delete[]temp_value; 
    return *this; 
} 

void My_string::show() const 
{ 
    std::cout << value << std::endl; 
} 

My_string My_string::operator =(const My_string & r_argument) 
{ 
    delete[] value; 
    value = new char[strlen(r_argument.value)+1]; 
    strcpy(value, r_argument.value); 
    return *this; 
} 

?彼らは両方のランタイムエラーが発生します。私はすべての動的に割り当てられたメモリにする必要があります。

デバッグアサーションが失敗しました! ... 式:_CrtisValidHeapPointer(ブロック)。

+0

デバッガでコードをライン単位でisnpectするとき、あなたは何を観察しましたか? –

+0

「ランタイムエラー」とは何ですか?それに応じて質問を編集してください。 –

+1

@ aleshka-batmanこれらの演算子の使い方を示す必要があります。たとえば、コピー代入演算子は明らかに間違っています。また、コピーコンストラクタを定義する必要があります。 –

答えて

3

operator+=operator=通常this参照を返します。

現在、コンパイルによって生成されたコピーコンストラクタを使用している値で戻ります。そのコンストラクタは、クラッシュの根本的原因であるデータバッファポインタvalueを取得します。ポインタに複数のdelete[]がうまく終わらないでしょう! 「3のルール」を研究することによって

スタート、オーバーロードされた演算子の戻り値の型を修正し、あなたのコピーコンストラクタと代入演算子を構築し、そこから継続します。

+0

「ルール3」は私のために働いた。私はコピーコンストラクタを定義しなければなりませんでした。それは適切に動作します。どうもありがとう。 –

+0

多くのことをここでやります:例えば'My_string(const char *);'を考慮してください。あなたの研究であなたを助けるためにC++に関する良い本を手に入れてください。 – Bathsheba

0

最初にそれが削除されるため、オブジェクトが自身に割り当てられているときに、少なくともコピー代入演算子は、深刻なバグが含まれています。また演算子は自分自身への参照を返すべきです。

まあ、事業者は

My_string & My_string::operator +=(const My_string &r_argument) 
{ 
    if (r_argument.value[0]) 
    { 
     char *temp_value = new char[strlen(value) + strlen(r_argument.value) + 1]; 
     strcpy(temp_value, value); 
     strcat(temp_value,r_argument.value); 

     delete [] value; 
     value = temp_value; 
    } 

    return *this; 
} 

My_string & My_string::operator =(const My_string &r_argument) 
{ 
    if (this != &r_argument) 
    { 
     char *temp_value = value; 

     size_t n = strlen(r_argument.value); 

     if (n != strlen(value)) 
     { 
      temp_value = new char[ n + 1 ]; 
     } 
     else 
     { 
      value = nullptr; 
     } 

     strcpy(temp_value, r_argument.value); 

     delete [] value; 

     value = temp_value; 
    } 

    return *this; 
} 

次のように定義することができますが、明示的にもコピーコンストラクタを定義する必要が考慮してください。

関連する問題