我试图通过重载类的'=='运算符来检查两个对象是否相等。基于我在Stack Overflow和其他地方阅读的所有内容,例如这篇文章:
我原本认为我正确地做了这件事,但我必须错过一些事情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
知道我错过了什么吗?任何帮助将不胜感激。
答案 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