如何访问std :: auto_ptr指向的对象

时间:2013-12-13 19:22:53

标签: c++ auto-ptr

在我的TicTacToe游戏中,我遇到了虚拟功能方面的问题。以下代码在Dev C ++中引发错误:“class std :: auto_ptr'没有名为'makeAMove'的成员。

根据错误,问题与makeAMove函数有关,但我看不出有什么问题。另外,我应该提一下,我正在使用已弃用的auto_ptr函数而不是unique_ptr,因为显然教师对我的代码进行分级的辅助工具没有符合C ++ 11的编译器。

现在playGame和makeAMove函数都没有做任何事情,但我想在继续之前找出导致错误的原因。

感谢您提出任何建议。

以下是相关代码:

Game.h(充当游戏的控制者)

#include "Player.h"
#include "AIPlayer.h"
#include "HumanPlayer.h"
#include <memory>

class Game 
{
    public: 
        Game(unsigned int players)
        {
            if (players == 1)
            {
                player1.reset (new HumanPlayer()); 
                player2.reset (new AIPlayer());
            }
            else 
            {
                player1.reset (new HumanPlayer());
                player2.reset (new HumanPlayer());
            }
        }

        void playGame()
        {
            player1.makeAMove();
        }

    private:
        std::auto_ptr<Player> player1; // pointer to a Player object (C++11 has more secure unique_ptr)
        std::auto_ptr<Player> player2; // pointer to a Player object
};

Player.h(HumanPlayer.h和AIPlayer.h的基类)

class Player
{
    public:
        virtual void makeAMove() = 0; // will accept pointer to board object as param
};

HumanPlayer.h

class HumanPlayer : public Player
{
    public:
        virtual void makeAMove()
        {
            // do some work
        }
};

AIPlayer.h

#pragma once // include guard
#include "Player.h"

class AIPlayer : public Player
{
    public:
        virtual void makeAMove()
        {
            // do some work
        }
};

的main.cpp

#include <iostream>
#include "Game.h"

int main() 
{
    Game myGame(1);
    myGame.playGame();

    return 0;
}

3 个答案:

答案 0 :(得分:5)

请注意,auto_ptr就像指针一样,因此您必须取消引用(使用operator*operator->)。

答案 1 :(得分:3)

智能指针包装器的行为就像指针一样。也就是说,当你想使用指针函数(在这种情况下是makeAMove)时,你需要取消引用它:

player1->makeAMove();

基本上,这里发生的是operator->将返回Player*,允许您调用Player的相应成员函数。使用operator.将允许您访问auto_ptr成员函数(这不是代码中您想要的那样)。

答案 2 :(得分:1)

我认为你的意图是:

player1.get()->makeAMove();

您需要在auto_ptr拥有的播放器对象上调用makeAMove,而不是在auto_ptr本身上调用{{1}}。虽然你可以解除auto_ptr的引用,就像普通指针一样(正如其他人指出的那样),这要归功于重载运算符。