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对象。它分配一个类型的指针Smetler。您正在尝试将 a const Smetler&(这是*thisinconst函数的类型)转换为 a Smetler*,这当然没有多大意义。

你可能想要的是这样的:

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

以上将在空闲存储区分配一个新对象并将对象Smetler复制this到新空间中。您delete最终必须返回指针以避免内存泄漏。

您真正想要的是使用智能指针,这样您就不必担心deletecopy(). 在 C++03 中,您可以使用std::auto_ptr(尽管它已被弃用,因为它可能会在不安全的情况下意外使用,例如您不能auto_ptr在 s 等容器中使用 s std::vector):

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

std::unique_ptr或者,如果您可以使用 C++11,请使用没有任何问题的更高级auto_ptr的。

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

上面的两个代码片段都有助于防止内存泄漏(而且一开始就不必担心它们!)

于 2012-04-10T12:30:09.513 回答