c ++中的auto_ptr问题

2 c++

我是新来的.我也是C++的新手所以这里是我写的类和函数.但是我得到了编译器错误我的类:

class fooPlayer
{
public:
       void fooPlayerfunc(){}//doing something here
       char askYesNo(std::string question);
};

class fooPlayerFactory
{
public:
   virtual std::auto_ptr<fooPlayer> MakePlayerX() const;
   virtual std::auto_ptr<fooPlayer> MakePlayerO() const;
private:
   std::auto_ptr<fooPlayer> MakePlayer(char letter) const;
   std::auto_ptr<fooPlayer> my_player;

};
Run Code Online (Sandbox Code Playgroud)

实施我的课程:

auto_ptr<fooPlayer> fooPlayerFactory:: MakePlayer(char letter) const
{
       my_player->fooPlayerfunc();
       return my_player;
}

auto_ptr<fooPlayer> fooPlayerFactory::MakePlayerX() const
{
      char go_first = my_player->askYesNo("Do you require the first move?");
      MakePlayer(go_first);
      return my_player;
}

auto_ptr<fooPlayer> fooPlayerFactory::MakePlayerO() const
{
    return my_player;
}
Run Code Online (Sandbox Code Playgroud)

我的main()函数在这里:

int main()
{
          fooPlayerFactory factory;
          factory.MakePlayerX();
          factory.MakePlayerO();
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:错误C2558:类'std :: auto_ptr <_Ty>':没有可用的复制构造函数或复制构造函数被声明为'explicit'

即使在阅读链接上的文档后,我也不知道如何更改它:

iai*_*ain 5

出错的原因是你在fooPlayerFactory :: MakePlayerO()中调用auto_ptr my_player的复制构造函数,这是一个const方法.这意味着无法修改其成员.

但是,auto_ptr的复制构造函数会修改右侧,因此返回my_player trys将其指针更改为0(NULL),同时将原始指针指定给返回值中的auto_ptr.

复制构造函数的签名是

auto_ptr<T>::auto_ptr<T>(auto_ptr<T> & rhs)
Run Code Online (Sandbox Code Playgroud)

auto_ptr<T>::auto_ptr<T>(const auto_ptr<T> & rhs)
Run Code Online (Sandbox Code Playgroud)

auto_ptr的复制构造函数将指针的所有权分配给左侧,右侧则不保留任何内容.

我不认为你想在这里使用auto_ptr,你可能想要boost :: smart_ptr

看起来你混淆了auto_ptr的两个用途

第一个是穷人的boost :: scoped_ptr.这是为了管理类中指针的单个实例,该类管理指针的生命周期.在这种情况下,你通常不会在你的类之外返回这个指针(你可以这是合法的,但boost :: smart_ptr/boost :: weak_ptr会更好,所以客户可以参与指针的生命周期)

第二个是它的主要目的是以异常安全的方式将新创建的指针返回给函数的调用者.

例如

auto_ptr<T> foo() {
    return new T;
}

void bar() {
    auto_ptr<T> t = foo();
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,我认为你混合了这两个用法auto_ptr是一个微妙的野兽,你应该仔细阅读auto_ptr文档.Scott MeyersEffective STL中也很好介绍了它.