visualstudio2010-c++选角问题

visual studio 2010 - problems with c++ casting

本文关键字:问题 visualstudio2010-c++      更新时间:2023-10-16

你好,我有三个类

  1. AbsSoccerTeam
  2. PlayersSoccerTeam
  3. PlayersFieldPlayerStates

PlayerSoccerTeam是AbsSoccerTeam的一个儿童班。

bool AlanSoccerTeam::isClosestTeamMemberToSupportingPlayer(FieldPlayer* plyr)

是球员足球队中的一种方法。

我正试图用这个调用PlayersFieldPlayerStates类中的那个方法

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

当我运行时,我会遇到这个问题

未初始化的本地变量"sTeam"使用

我不知道发生了什么事,也不知道为什么我会犯这个错误。

任何帮助都会得到极大的重视感谢

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

我建议你这样做。

PlayersSoccerTeam sTeam;
sTeam.isClosestTeamMemberToSupportingPlayer(player);

你也可以这样做。

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

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

PlayersSoccerTeam* sTeam;

这一行声明了一个指向PlayersSoccerTeam的指针,而没有其他内容。你从这行得到的只是一个指针。它没有特别指向任何地方,因为您还没有初始化。没有PlayersSoccerTeam可以指向。

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

PlayersSoccerTeam sTeam;
sTeam.isClosestTeamMemberToSupportingPlayer(player);

既然您告诉了我们您的层次结构,那么您可能希望将PlayersSoccerTeam多晶型地用作AbstSoccerTeam。在这种情况下,您需要使用指针或引用。可以这样做:

AbstSoccerTeam* sTeam = new PlayersSoccerTeam();
// ...
delete sTeam;

请注意,这仍然只声明了一个指针,但表达式new PlayersSoccerTeam也为指针创建了一个PlayersSoccerTeam对象。请注意,将指向PlayersSoccerTeam的指针分配给指向其父AbstSoccerTeam的指针是完全可以的,这就是多态性。如果您这样做,您必须确保稍后delete sTeam;,否则对象将被泄露。

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

std::unique_ptr<AbstSoccerTeam> sTeam(new PlayersSoccerTeam());

现在您将不必使用delete,因为std::unique_ptr会为您处理这些问题。