1

私はいくつかのプログラムを実行しており、実装に関してはこれまでのところうまくいっていますが、今は些細な問題で立ち往生していますが、その解決策を見つけることができません。問題はコードのこの部分にあり、それは言う

エラー1エラーC2662:'Smetler :: action':'this'ポインターを'const Smetler'から'Smetler&'に変換できません

私はそれが言われたことをすべて適用したと確信しているので、誰もがここでの問題が何であるかを知っています。

  virtual void action()
  {
    std::cout << "I'm a copy" << copy() << ". Doing observations." << std::endl;
  }      
  Smetler* copy() const { return new Smetler (*this); }     
   private:
   void writeDown(ostream& wd) const                            
   { 
      wd << Worker::getOccupation() << " " << Worker::getName() << ',' <<  Worker::getPosition()  << action(); 
   }
   };

前もって感謝します。

4

1 に答える 1

5

あなたはこれを持っています:

Smetler* copy() const { return new Smetler* (*this); }    

Smetlerこれはオブジェクトを割り当てません。型のポインタを割り当てますSmetlerconst Smetler&a (*thisinconst関数の型)を aに変換しようとしていますがSmetler*、もちろんあまり意味がありません。

おそらくあなたが望むのはこれです:

Smetler* copy() const { return new Smetler(*this); }

上記はSmetler、空きストアに新しいを割り当て、thisオブジェクトを新しいスペースにコピーします。deleteメモリリークを避けるために、最終的に返されたポインタを使用する必要があります。

delete本当に欲しいのは、スマート ポインターを使用することです。そのため、返されたポインターを から取得することを心配する必要はありませんcopy()。C++03 では、以下を使用できます(ただし、安全でない状況で誤って使用される可能性があるため、非推奨になっています。たとえば、 のようなコンテナーでは s をstd::auto_ptr使用できません)。auto_ptrstd::vector

std::auto_ptr<Smetler> copy() const
{
    return std::auto_ptr<Smetler>(new Smetler(*this));
}

または、C++11 を使用できる場合は、std::unique_ptrこれらの問題のないはるかに優れたものを使用してくださいauto_ptr

std::unique_ptr<Smetler> copy() const
{
    return std::unique_ptr<Smetler>(new Smetler(*this));
}

上記のコード スニペットはどちらも、メモリ リークを防止するのに大いに役立ちます (そもそもメモリ リークについて心配する必要はありません!)。

于 2012-04-10T12:30:09.513 に答える