我有一个虚拟class Element
强制其派生类具有==运算符:
因此,我派生了实现该运算符的类(Integer,Word)。
我有class Group
基本上是一个元素列表。
在一个函数中,我想比较一个组中的元素是否等于另一个组的元素,所以我正在使用:
if(actual == lookingfor)
其中actual和lookingfor都是指向Element的指针......但是比较是在指针级别进行的,因此两个指针总是不同。
如何强制使用派生类元素中的operator ==?
编辑:
class Element
{
virtual int operator==(Elemento *)=0;
}
class Word : public Element { ... }
int Word::operator==(Element * element)
{
Element * ptr = element;
Word * wordPtr = dynamic_cast< Word * >(ptr);
int equal = 0;
if(wordPtr)
{
equal = strncmp(this->ptr,wordPtr->ptr,49)==0;
}
return igual;
}
答案 0 :(得分:1)
我不知道==运算符会在这里做你想要的,但是你总是可以定义一个虚方法:
class Element {
[...]
virtual IsEqualTo(const Element & rhs) const = 0;
};
...然后对于每个子类,实现如下方法:
class Word : public Element {
[...]
virtual IsEqualTo(const Element & rhs) const
{
const Word * wrhs = dynamic_cast<const Word *>(&rhs);
return ((wrhs)&&(*wrhs == *this));
}
};
...然后你的Group方法可以根据需要直接在组中的各个元素上调用IsEqualTo(),或者如果你想让它“漂亮”,你可以实现Element :: operator ==(const元素&amp;)在内部调用IsEqualTo(),让你的组方法(等)调用它,例如
bool Element :: operator == (const Element & rhs) const
{
return IsEqualTo(rhs);
}
答案 1 :(得分:0)
首先,示例代码会很好......
从您的代码看起来像这样的信息来源
Group* group1 = new Group();
Group* group2 = new Group();
if ( group1 == group2 )
这是一个指针比较。你必须比较实例:
if ( *group1 == *group2 )
答案 2 :(得分:0)
if(actual == lookingfor)
其中actual和lookingfor都是指向Element的指针......但是正在进行比较 在指针级别,所以两个指针总是不同。
你做不到。只有当至少一个参数是用户定义的类型时,才能重载C ++中的运算符。编译器会在其他任何内容上标记错误。
如果您希望在这种情况下进行比较,则必须使用:
if(*actual == *lookingfor) //for element-comparison
如果你想比较一个指针数组,或类似的东西,你必须求助于使用循环编写自己的代码。
我在这里建议的是,为什么不使用std::vector<Element>
或任何其他合适的STL容器?
答案 3 :(得分:0)
请注意,以下实现使用引用而不是指针作为operator==
的参数,在struct Element
中定义为 pure-abstract 。这就是通常的做法,我建议你在代码中做同样的事情。
#include <iostream>
struct Element {
virtual ~Element () {}
virtual bool operator== (Element&) const =0;
};
struct Integer : Element {
bool operator== (Element&) const {
return false; /* dummy impl */
}
};
struct Word : Element {
bool operator== (Element&) const {
return false; /* dummy impl */
}
};
不可能重载C++
中指针的比较,你必须取消引用你的指针,这样你才能获得可以正常方式比较的有效对象,以及你自己的{{1}将被召唤。
operator==
另一种方法是直接通过指针调用int
main (int argc, char *argv[])
{
Element * e1 = new Integer;
Element * e2 = new Word;
if (*e1 == *e2)
;
delete e2;
delete e1;
}
,如下例所示。
operator==