2

我有一个 virtualclass 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; 
}
4

4 回答 4

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 方法可以根据需要直接在 Groups 中的各种元素上调用 IsEqualTo() ,或者如果您希望使其“漂亮”,您可以实现 Element::operator==(const Element &)改为在内部调用 IsEqualTo(),并让您的 Group 方法(等)调用它,例如

bool Element :: operator == (const Element & rhs) const
{
   return IsEqualTo(rhs);
}
于 2012-06-18T05:30:20.533 回答
0

请注意,下面的实现使用引用而不是指针作为参数来定义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))
  ;

于 2012-06-18T05:34:38.257 回答
0

首先,示例代码会很好......

从您的代码的信息位派生看起来像这样

Group* group1 = new Group();
Group* group2 = new Group();

if ( group1 == group2 )

这是一个指针比较。您必须比较实例:

if ( *group1 == *group2 )
于 2012-06-18T05:23:05.697 回答
0

如果(实际 == 寻找)

实际和查找都是指向元素的指针......但是比较是在指针级别进行的,所以两个指针总是不同的。

你不能。只有当至少一个参数是用户定义类型时,C++ 中的运算符才能被重载。编译器将标记其他任何错误。

如果您想在这种情况下进行比较,则必须使用:

if(*actual == *lookingfor) //for element-comparison

如果你想比较一个指针数组,或者类似的东西,你必须求助于使用循环编写自己的代码。

我在这里建议的是,为什么不使用std::vector<Element>或任何其他合适的 STL 容器?

于 2012-06-18T05:25:45.360 回答