C++ c+的问题+;铸造

C++ c+的问题+;铸造,c++,visual-studio-2010,visual-c++,casting,C++,Visual Studio 2010,Visual C++,Casting,你好,我有三节课 Abssoccerteam 运动员足球队 PlayersFieldPlayerStates PlayerSoccerTeam是AbstSoccerTeam的一个子类 bool AlanSoccerTeam::isClosestTeamMemberToSupportingPlayer(FieldPlayer* plyr) 是足球队中的一种方法 我试图用这个函数调用PlayersFieldPlayerStates类中的方法 PlayersSoccerTeam* sTeam; sT

你好,我有三节课

  • Abssoccerteam
  • 运动员足球队
  • PlayersFieldPlayerStates
  • PlayerSoccerTeam是AbstSoccerTeam的一个子类

    bool AlanSoccerTeam::isClosestTeamMemberToSupportingPlayer(FieldPlayer* plyr)
    
    是足球队中的一种方法

    我试图用这个函数调用PlayersFieldPlayerStates类中的方法

    PlayersSoccerTeam* sTeam;
    sTeam->isClosestTeamMemberToSupportingPlayer(player);
    
    当我运行它时,我会遇到这个问题

    使用未初始化的局部变量“sTeam”

    我不知道发生了什么,也不知道为什么会出现这个错误

    任何帮助都是非常感激的 谢谢你

    PlayersSoccerTeam* sTeam;
    
    这一行声明了一个指向
    播放器Soccerteam
    的指针,没有其他内容。从这一行得到的只是一个指针。因为您还没有初始化,所以它不会特别指向任何地方。没有可指向的
    播放器Soccerteam

    如果您想要类型为
    PlayersSoccerTeam
    的对象,那么您只需要:

    PlayersSoccerTeam sTeam;
    sTeam.isClosestTeamMemberToSupportingPlayer(player);
    
    由于您告诉我们您的层次结构,您可能希望将您的
    PlayersSoccerTeam
    多态性用作
    abssoccerteam
    。在这种情况下,您需要使用指针或引用。可以这样做:

    AbstSoccerTeam* sTeam = new PlayersSoccerTeam();
    // ...
    delete sTeam;
    
    注意,这仍然只声明了一个指针,但是表达式
    newplayerssoccerteam
    也为指针创建了一个
    PlayersSoccerTeam
    对象。请注意,将指向
    PlayersSoccerTeam
    的指针指定给指向其父对象的指针是完全正确的-这是多态性的作用。如果这样做,必须确保
    删除sTeam稍后,否则对象将泄漏

    处理动态分配对象的用户的更安全的方法是使用智能指针,您可以这样做:

    std::unique_ptr<AbstSoccerTeam> sTeam(new PlayersSoccerTeam());
    
    std::unique_ptr sTeam(新播放器soccerteam());
    

    现在,您不必
    删除它,因为
    std::unique\u ptr
    会为您解决这个问题。

    问题是您已经创建了指向PlayerSoccerteam的指针,但实际上还没有创建对象本身

    我建议这样做

    PlayersSoccerTeam sTeam;
    sTeam.isClosestTeamMemberToSupportingPlayer(player);
    
    你也可以这样做

    PlayersSoccerTeam* sTeam = new PlayersSoccerTeam()
    sTeam->isClosestTeamMemberToSupportingPlayer(player);
    

    也许是一次有趣的教育体验,创建一个构造函数,在stdout运行时将其打印到stdout,然后尝试执行这两个选项和您的选项,看看会发生什么。每当创建一个新对象时,构造函数就会运行。

    更安全的方法是使用
    make_unique
    …它的意思就是它所说的;您有一个变量
    sTeam
    ,您试图在不初始化它的情况下使用它。如果你不明白为什么会出现这个问题,问问自己“哪个团队应该
    sTeam
    代表?”和“哪个团队应该
    sTeam
    代表?”?(为什么/如何代表该团队?)