错误C2662问题

时间:2012-04-10 12:27:11

标签: c++ c visual-studio-2010 visual-c++

我正在做一些程序,到目前为止关于实现这么好,但是现在我遇到了一些微不足道的问题,但是我无法找到解决方案。问题在于代码的这一部分,它说

  

错误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(); 
   }
   };

提前致谢。

1 个答案:

答案 0 :(得分:5)

你有这个:

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

这不会分配Smetler个对象。它分配一个类型为Smetler的指针。您正在尝试将const Smetler&*this函数中const的类型)转换为Smetler*,这当然不会很有道理。

你可能想要的是:

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

以上将在免费商店中分配新的Smetler并将this对象复制到新空间。最后必须delete返回的指针以避免内存泄漏。

你真正想要的是使用智能指针,这样你就不必担心delete来自copy()的返回指针。在C ++ 03中,您可以使用std::auto_ptr(虽然它已被弃用,因为它可能会在不安全的情况下被意外使用,例如您无法在{{1}等容器中使用auto_ptr }}):

std::vector

或者,如果您可以使用C ++ 11,请使用更加优越的std::auto_ptr<Smetler> copy() const { return std::auto_ptr<Smetler>(new Smetler(*this)); } ,它不会遇到std::unique_ptr个问题。

auto_ptr

以上代码片段都有助于防止内存泄漏(并且首先不必担心它们!)