-2

こんにちは、私は3つのクラスを持っています

  1. アブストサッカーチーム
  2. 選手サッカーチーム
  3. PlayersFieldPlayerStates

PlayerSoccerTeam は AbstSoccerTeam の子クラスです。

bool AlanSoccerTeam::isClosestTeamMemberToSupportingPlayer(FieldPlayer* plyr)

選手サッカーチームでのメソッドです。

私はこれで PlayersFieldPlayerStates クラスでそのメソッドを呼び出そうとしています

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

実行するとこの問題が発生する可能性があります

初期化されていないローカル変数 'sTeam' が使用されました

何が起こっているのか、なぜこのエラーが発生するのかわかりません。

どんな助けでも大歓迎ですありがとう

4

2 に答える 2

1
PlayersSoccerTeam* sTeam;

この行は、aへのポインタを宣言し、他にはPlayersSoccerTeam何も宣言していません。この行から得られるのはポインタだけです。初期化していないので、特にどこも指していません。指し示す場所はありませんPlayersSoccerTeam

タイプのオブジェクトが必要な場合は、次のPlayersSoccerTeamようにします。

PlayersSoccerTeam sTeam;
sTeam.isClosestTeamMemberToSupportingPlayer(player);

階層について教えてくれたので、PlayersSoccerTeam多形的にを使用したい場合がありますAbstSoccerTeam。この場合、ポインタまたは参照のいずれかを使用する必要があります。これは次のように行うことができます:

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

これでもポインタのみが宣言されますが、式はポインタが指すオブジェクトnew PlayersSoccerTeamも作成することに注意してください。aへのポインタをその親へのPlayersSoccerTeamポインタに割り当てるのはまったく問題ないことに注意してください。これは実際のポリモーフィズムです。これを行う場合は、後で確認する必要があります。そうしないと、オブジェクトがリークします。PlayersSoccerTeamAbstSoccerTeamdelete sTeam;

動的に割り当てられたオブジェクトのユーザーを処理するためのより安全な方法は、スマートポインターを使用することです。これは、次のように行うことができます。

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

今、あなたはあなたのためにそれを世話deleteするので、あなたはそれにする必要はありません。std::unique_ptr

于 2013-03-04T18:36:44.273 に答える
1

問題は、PlayersSoccerTeam へのポインターを作成しましたが、実際にはオブジェクト自体をまだ作成していないことです。

これを行うことをお勧めします。

PlayersSoccerTeam sTeam;
sTeam.isClosestTeamMemberToSupportingPlayer(player);

または、これを行うこともできます。

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

おそらく興味深い教育経験として、実行時に何かを標準出力に出力するコンストラクターを作成し、これら2つのオプションとあなたのオプションを実行して何が起こるかを確認してください。新しいオブジェクトが作成されるたびに、コンストラクターが実行されます。

于 2013-03-04T18:37:26.630 に答える