0

論理的な比較を行い、ブール値の答えを返す必要があります。

.cppファイルのコードは次のとおりです。

bool MyString::operator==(const MyString& other)const
{
    if(other.Size == this.Size)
    {
            for(int i = 0; i < this.Size+1; i++)
            {
                    if(this[i] == other[i])

                            return true;
            }
    }
    else
            return false;
}

main.cppファイルから呼び出されるものは次のとおりです。

 if (String1 == String4)
 {
    String3.Print ();
 }
 else
 {
     String4.Print ();
 }

これが私が得るコンパイルエラーです:

error: request for member `Size` in `this`, which is of non-class type `const MyString* const`
error: no match for `operator[]` in `other[i]`
4

3 に答える 3

4

thisはポインタであるため、逆参照する必要があります。

this->Size;

operator==また、あなたのロジックには欠陥があると思います。ここでtrueは、文字のいずれかが2番目の文字列の同じ位置にある文字と等しい場合に返されます。ループをに変更します

        for(int i = 0; i < this->Size+1; i++)
        {
                if(this[i] != other[i])

                        return false;
        }

return true;コードの最後の部分(句)の代わりに、文字else列全体を比較します。

operator[]Sethが述べたように、上記のように使用することはできませんthis-このように配列として扱われます(つまりthis[i]、実際には*(this + i)-ですから、あなたが考えていることではありません)。代わりに、内部ストレージメンバーにアクセスしてください。

于 2012-04-28T22:58:05.093 に答える
2

コードの問題:

  • this[i]:ここで文字列のi番目の文字にアクセスしたいようです。これはそれをしていません。クラスがオーバーロードすると仮定するとoperator[]、が必要になり(*this)[i]ます。または、文字列の内部表現に直接アクセスすることもできます。

  • if(this[i] == other[i]) return true;:文字列「A1」と「AB」の比較に関して、これが何を意味するかを考えてください。

  • for () {...}:ループを終了するとどうなりますか?比較が戻ることなくループを通過することができた場合は、何かを返す必要があります。

于 2012-04-28T23:28:37.507 に答える
0

C++標準アルゴリズムを使用できるかどうかは指定していません。ここでは、手書きのループとstd::equalアルゴリズムを使用して、両方のバージョンを示しています。

//#define USE_STD_ALGORITHM 1 // uncomment to enable std::equal version
#include <cassert>
#include <algorithm>
#include <stdexcept>

// NOTE: partial simplest definition for the test and presentation purposes only.
struct MyString
{
    MyString(char const* s, std::size_t size) : data(s), Size(size) {}
    char const& operator[](std::size_t index) const;
    bool operator==(const MyString& other) const;
private:
    char const* data;
    std::size_t Size;
};

char const& MyString::operator[](std::size_t index) const
{
    if (index < Size)
        return data[index];
    throw std::out_of_range("index invalid");
}

bool MyString::operator==(const MyString& other) const
{
    if (this->Size == other.Size)
    {
#ifdef  USE_STD_ALGORITHM
        return std::equal(data, data+Size, other.data);
#else
    bool equal = true;
    for(std::size_t i = 0; i < this->Size; ++i)
    {
        if((*this)[i] != other[i])
        {
            equal = false;
            break;
        }
    }
    return equal;
#endif
    }

    return false;
}

int main()
{
    char const* a = "abc";
    char const* b = "abc";
    MyString sa(a, 3);
    MyString sb(b, 3);
    assert(sa == sb);

    char const* c = "adc";
    MyString sc(c, 3);
    assert(!(sa == sc));

    char const* d = "ab";
    MyString sd(d, 2);
    assert(!(sa == sd));
}

幸運を!

于 2012-04-28T23:28:22.210 に答える