まず、for
ループに入って条件&other == this
が満たされない場合、何も返されません。これを修正するには、else
ステートメントを削除するだけです。other.Size == this->Size
これにより、条件が満たされない場合、またはループ全体を通過し、ループ内で使用されていない場合、関数は false を返します return
。
2 番目の問題は、行if(&other == this)
です。ループ内で、文字列のすべてのシンボルをチェックするつもりだと思います。しかし今は、クラス自体へのポインターのみをチェックしています。文字をチェックするには、データを保存if( other->data == this->data )
するメンバーがある場合、 のようなものを使用する必要がありdata
ます (トートロジーで申し訳ありません)。
もう 1 つの小さな流れがデザインにあります。文字列が等しいことを確認するには、すべての文字を調べて一致することを確認する必要があります。ただし、文字列が等しくないことを証明するには、一致しない文字のペアを 1 つだけ見つける必要があります。その後、比較を続けても意味がありません。したがって、一致しないペアを見つけたらすぐに比較を停止し、他の文字の無駄な比較を行わないように、サイクル内の条件を負の条件に変更することをお勧めします。
一般に、すべてのエラーをできるだけ早く返し、不要な計算を避けることをお勧めします。したがって、単純なチェックで関数の最初に何かをチェックできる場合は、それを実行することをお勧めします。
したがって、結局のところ、次のようなものが必要です。
bool MyString::operator==(const MyString& other)const
{
if(other.Size != this->Size)
return false;//If the sizes do not match, no need to check anything else. Just return false.
//If we are here, the sizes match. Lets check the characters.
for(int i = 0; i < this->Size+1; i++)
{
//If some pair doesnt match, the strings are not equal, and we exit.
if( other->data[i] != this->data[i])
return false;
}
//If we are here, all the characters did match, so we return true.
return true;
}