如何强制派生类比较
How to force a derived class comparison
>我有一个虚拟class Element
,强制其派生类具有 == 运算符:
因此,我有实现该运算符的派生类(整数,单词)。
我有一个class Group
基本上是一个元素列表。
在一个函数中,我想比较一个组中的元素是否等于另一个组的元素,所以我使用:
if(actual == lookingfor)
其中实际和寻找都是指向元素的指针......但是比较是在指针级别进行的,因此两个指针总是不同的。
如何强制使用元素派生类中的运算符 ==?
编辑:
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;
}
== 运算符在这里会完全按照您的要求,但您始终可以定义一个虚拟方法:
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 方法可以根据需要直接在 Groups 中的各种元素上调用 IsEqualTo(),或者如果你更喜欢让它"漂亮",你可以实现 Element::operator==(const Element &) 来在内部调用 IsEqualTo(),并让你的 Group 方法(等)调用它,例如
bool Element :: operator == (const Element & rhs) const
{
return IsEqualTo(rhs);
}
请不要使用引用而不是指针作为参数,以operator==
在struct Element
中定义为纯抽象。这是它通常完成的方式,我建议您在代码中执行相同的操作。
#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++
中不可能重载指针的比较,您必须取消引用指针,以便获得可以正常方式比较的有效对象,并调用您自己的operator==
。
int
main (int argc, char *argv[])
{
Element * e1 = new Integer;
Element * e2 = new Word;
if (*e1 == *e2)
;
delete e2;
delete e1;
}
另一种方法是直接通过指针调用operator==
,如以下示例所示。
if (e1->operator== (*e2))
;
首先,示例代码会很好...
从信息位派生您的代码看起来像这样
Group* group1 = new Group();
Group* group2 = new Group();
if ( group1 == group2 )
这是一个指针比较。您必须比较实例:
if ( *group1 == *group2 )
if(实际 == 查找)
其中实际和寻找都是指向元素的指针......但正在进行比较 在指针级别,因此两个指针总是不同的。
你不能。仅当至少有一个参数是用户定义类型时,才能重载 C++ 中的运算符。编译器将标记其他任何错误。
如果您想在这种情况下进行比较,则必须使用:
if(*actual == *lookingfor) //for element-comparison
如果你想比较一个指针数组,或者类似的东西,你必须求助于使用循环编写自己的代码。
我在这里建议的是,为什么不使用std::vector<Element>
或任何其他合适的STL容器?
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 在派生函数中指定void*参数
- std::用派生类对象设置,但用gcc8.1设置基类比较器
- 在 MSVC 中,从 std::string_view 派生的对象比较不明确
- 继承比较运算符,但不能将派生类彼此进行比较
- C++:同一对象的基础与派生的指针比较
- 比较基类的 2 个派生对象
- 如何强制派生类比较
- Rcpp:比较从 R 数据帧派生的字符串的简洁方法
- 比较派生模板类中的字段
- 使用typeid在派生类之间进行比较
- 重载派生类的比较运算符==,以便对任意数量的基类进行缩放
- 派生自 std::p riority_queue 不使用比较器谓词/模板参数的类
- 在c++中从int派生不同且不可比较的类型
- 比较派生类之间的类型
- 比较基类和派生类的指针