C ++检查两个对象是否等于重载==运算符,总是假?

时间:2015-12-05 20:50:20

标签: c++

我试图通过重载类的'=='运算符来检查两个对象是否相等。基于我在Stack Overflow和其他地方阅读的所有内容,例如这篇文章:

C++ object equality

我原本认为我正确地做了这件事,但我必须错过一些事情b / c我的比较总是假的,即使对象是相同的。这是比较它们的函数,它是第一个if语句:

///////////////////////////////////////////////////////////////////////////////////////////////////
std::vector<PossibleChar> findVectorOfMatchingChars(PossibleChar possibleChar, std::vector<PossibleChar> vectorOfChars) {
    std::vector<PossibleChar> vectorOfMatchingChars;                // this will be the return value

    for (auto possibleMatchingChar = vectorOfChars.begin(); possibleMatchingChar != vectorOfChars.end(); possibleMatchingChar++) {
        if (*possibleMatchingChar == possibleChar) {                // !!!!!!!!!!! this does not seem to work !!!!!!!!!!!!!!
            continue;                                               // !!!!!!!!!! it never gets in here, even when I'm 100% sure the variables refer to the same object
        }

        double dblDistanceBetweenChars = distanceBetweenChars(possibleChar, *possibleMatchingChar);
        double dblAngleBetweenChars = angleBetweenChars(possibleChar, *possibleMatchingChar);
        double dblChangeInArea = abs(possibleMatchingChar->intRectArea - possibleChar.intRectArea) / possibleChar.intRectArea;
        double dblChangeInWidth = abs(possibleMatchingChar->boundingRect.width - possibleChar.boundingRect.width) / possibleChar.boundingRect.width;
        double dblChangeInHeight = abs(possibleMatchingChar->boundingRect.height - possibleChar.boundingRect.height) / possibleChar.boundingRect.height;

        if (dblDistanceBetweenChars < (possibleChar.dblDiagonalSize * MAX_DIAG_SIZE_MULTIPLE_AWAY) &&
            dblAngleBetweenChars < MAX_ANGLE_BETWEEN_CHARS &&
            dblChangeInArea < MAX_CHANGE_IN_AREA &&
            dblChangeInWidth < MAX_CHANGE_IN_WIDTH &&
            dblChangeInHeight < MAX_CHANGE_IN_HEIGHT) {
            vectorOfMatchingChars.push_back(*possibleMatchingChar);
        }
    }

    return(vectorOfMatchingChars);
}

这是在PossibleChar.h中的==覆盖:

///////////////////////////////////////////////////////////////////////////////////////////////
bool operator == (const PossibleChar& otherPossibleChar) const {
    if (this == &otherPossibleChar) return true;
    else return false;
}

如果有人想知道,那么这就是所有的PossibleChar.h:

// PossibleChar.h

#ifndef POSSIBLE_CHAR_H
#define POSSIBLE_CHAR_H

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

///////////////////////////////////////////////////////////////////////////////////////////////////
class PossibleChar {
public:
    // member variables ///////////////////////////////////////////////////////////////////////////
    std::vector<cv::Point> contour;

    cv::Rect boundingRect;

    int intCenterX;
    int intCenterY;

    double dblDiagonalSize;
    double dblAspectRatio;

    int intRectArea;

    ///////////////////////////////////////////////////////////////////////////////////////////////
    static bool sortCharsLeftToRight(const PossibleChar &pcLeft, const PossibleChar & pcRight) {
        return(pcLeft.intCenterX < pcRight.intCenterX);
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////
    bool operator == (const PossibleChar& otherPossibleChar) const {
        if (this == &otherPossibleChar) return true;
        else return false;
    }

    // function prototypes ////////////////////////////////////////////////////////////////////////
    PossibleChar(std::vector<cv::Point> _contour);


};

#endif  // POSSIBLE_CHAR_H

知道我错过了什么吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

您当前的operator==假定对象位于同一地址,因此如果您执行类似

的操作
PossibleChar p1;
PossibleChar p2 = p1;
std::cout << p1 == p2 << '\n';

会打印 false

如果那确实是你想要的,那就好了 如果,则需要定义operator==比较对象的所有必要 1 成员,而不是地址。

1 &#34;必要&#34;意味着&#34;成员定义对象的状态&#34;在这里,也就是说,它取决于应该比较成员的类别。

答案 1 :(得分:1)

只有在将对象与自身进行比较时,operator==才会返回true。两个不同的对象永远不会相等,因为不同的对象具有不同的地址。

您似乎确实想要这种行为(尽管您没有指定它)。但是,您的程序会过多地复制对象:

findVectorOfMatchingChars(PossibleChar possibleChar, ...);

上述声明使函数按值接收“可能的char”,将其复制到新对象中。这绝不会等于任何其他现有对象!

你可能想要:

findVectorOfMatchingChars(const PossibleChar& possibleChar, ...);

这将通过引用传递“可能的char”,它的地址将是现有“可能的char”的地址(我猜,这是你向量中可能的字符之一)。

你甚至可以传递一个地址:

findVectorOfMatchingChars(const PossibleChar* possibleChar, ...);

这将警告不知情的用户您的代码,它会使用地址执行某些操作。这也会阻止天真的用户传递新构造的对象:

findVectorOfMatchingChars(PossibleChar(), ...); // error

PossibleChar x;
findVectorOfMatchingChars(&x, ...); // works