如何强制派生类比较

How to force a derived class comparison

本文关键字:比较 派生 何强制      更新时间:2023-10-16

>我有一个虚拟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容器?