我正在尝试理解在STL(SCL)中使用自定义类时需要重载的运算符。
任何人都可以告诉我,我做错了什么?
class myClass
{
public:
int data;
myClass()
{
data =0;
cout<<"Default const "<<endl;
}
myClass(int x)
{
data = x;
cout<<"Int constructor"<<endl;
}
myClass(const myClass &m)
{
cout<<"Copy constructor"<<endl;
}
bool operator == (const myClass &temp)
{
cout<<"Operator called &";
return data == temp.data;
}
bool operator == (const myClass *temp)
{
cout<<"Operator called *";
return data == temp->data;
}
};
int main ()
{
/*
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), meObj);
*/
vector<myClass*> myVec;
myClass temp;
myVec.push_back(&temp);
myClass temp2(19);
myVec.push_back(&temp2);
myClass temp3(19);
vector<myClass*>::iterator it = find(myVec.begin(),myVec.end(),&temp2); //works
if(it!=myVec.end())
{
cout<<"Value is "<<(*it)->data;
}
vector<myClass*>::iterator dit = find(myVec.begin(),myVec.end(),&temp3); //fails
if(dit!=myVec.end())
{
cout<<"Value is "<<(*dit)->data;
}
cout << endl;
return 0;
}
如果我错了,请纠正我,但第一次查找是有效的,因为它进行地址比较。为了使上述工作更加重要,我需要做什么?
签名是否有意义?
bool operator == (const myClass &temp); // seen in many places
bool operator == (const myClass *temp); // what if two pointer types of same object are being compared?
干杯!
答案 0 :(得分:3)
运算符重载必须至少具有一个用户定义的类型。因此,您不能为两个指针重载operator==
,例如。
你的myClass::operator==(const myClass *temp)
在编译的意义上是有效的,但是它的语义意义很小,并且不推荐(很少有你想做T x; T *y; ... (x == y)
的情况。)< / p>
对于您的情况,您有一个指针向量,您可能需要考虑std::find_if
,它采用谓词。类似的东西:
class CompareByPointer
{
public:
explicit CompareByPointer(const myClass &p) : p(p) {}
bool operator() (const myClass &rhs) const { return p->data == rhs->data; }
private:
const myClass &p;
};
...
find_if(myVec.begin(), myVec.end(), CompareByPointer(&temp2));
[作为旁注,您通常应尽可能定义成员函数const
。因此,运算符重载应为const
。]
答案 1 :(得分:1)
在示例代码中,您尚未将&temp3
推入myVec
。因此,第二个std::find
失败是有道理的。
答案 2 :(得分:0)
在这种情况下,“工作”是什么意思?通常,当您存储指针时,这是因为对象确实具有标识,并且比较地址是正确的事情。否则,您应该存储值(尽管有例外)。无论如何,您始终可以使用find_if
以及您想要的任何比较条件。对于除最简单类型之外的任何内容,我发现自己使用find_if
的频率高于find
。通常,你不是在寻找平等,而是寻找某种特定类型的匹配。例如,在这里,你更可能想要这样的东西:
std::vector<MyClass>::iterator it = std::find_if( myVect.begin(), myVect.end(),
boost::bind(&MyClass::id, _1, 19) );
(假设这里的data
是某种标识符,并且您提供了一个成员函数myClass::id()
来阅读它。)