逻辑比较==运算符重载

时间:2012-04-28 22:56:31

标签: c++ comparison operator-overloading

我需要做一些逻辑比较并返回一个布尔答案。

以下是.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]`

3 个答案:

答案 0 :(得分:4)

this是一个指针,因此你必须取消引用它:

this->Size;

此外,我认为你operator==的逻辑存在缺陷 - 在这里,如果任何字符等于第二个字符串中相同位置的字符,则返回true。将你的循环改为

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

                        return false;
        }

并放置return true;而不是代码的最后一部分(else子句)来比较整个字符串。

正如Seth所提到的,你不能在operator[]上使用this,因为它被视为数组(即this[i]真的是*(this + i) - 所以不是什么你在想它是。请改为访问内部存储成员。

答案 1 :(得分:2)

代码问题:

  • this[i]:你显然想在这里访问字符串的第i个字符。这不是那样做的。假设您的班级超载operator[],您需要(*this)[i]。或者,您可以直接访问字符串的内部表示。

  • if(this[i] == other[i]) return true;:想一想比较字符串“A1”和“AB”的含义。

  • for () {...}:退出循环后会发生什么?如果比较设法通过循环而不返回,则需要返回一些内容。

答案 2 :(得分: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));
}
祝你好运!