2

class Element派生クラスに==演算子を強制する仮想があります。

そのため、その演算子を実装するクラス(Integer、Word)を派生させました。

基本的class Groupに要素のリストです。

関数では、グループの要素が別のグループの要素と等しいかどうかを比較したいので、次を使用しています。

if(actual == lookingfor)

ここで、actualとlookingforは両方ともElementへのポインターです...しかし、比較はポインターのレベルで行われているため、両方のポインターは常に異なります。

要素の派生クラスの演算子==を強制的に使用するにはどうすればよいですか?

編集:

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メソッドは、必要に応じてグループ内のさまざまな要素に対してIsEqualTo()を直接呼び出すか、「きれい」にしたい場合は、Element :: operator ==(const Element&)を実装できます。代わりに内部でIsEqualTo()を呼び出し、グループメソッド(など)にそれを呼び出させます。

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

まず第一に、サンプルコードがいいでしょう...

情報のビットから派生すると、コードは次のようになります

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

if ( group1 == group2 )

これはポインタの比較です。インスタンスを比較する必要があります。

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

if(実際==探している)

ここで、actualとlookingforは両方ともElementへのポインターです...しかし、比較はポインターのレベルで行われているため、両方のポインターは常に異なります。

できません。C ++の演算子は、少なくとも1つの引数がユーザー定義型である場合にのみオーバーロードできます。コンパイラは、それ以外の場合はエラーのフラグを立てます。

その場合に比較したい場合は、以下を使用する必要があります。

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

ポインタの配列などを比較する場合は、ループを使用して独自のコードを作成する必要があります。

ここで私が提案するのは、std::vector<Element>他の適切なSTLコンテナを使用してみませんか?

于 2012-06-18T05:25:45.360 に答える
0

以下の実装では、でpure-abstractoperator==として定義される引数として、ポインタではなく参照を使用していることに注意してください。これは通常行われる方法であり、コードでも同じことを行うことをお勧めします。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; 
}

もう1つの方法はoperator==、次の例のように、ポインタを介して直接を呼び出すことです。

if (e1->operator== (*e2))
  ;

于 2012-06-18T05:34:38.257 に答える