如何强制派生类比较

时间:2012-06-18 05:18:59

标签: c++ inheritance

我有一个虚拟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; 
}

4 个答案:

答案 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==