【发布时间】:2019-07-22 04:05:27
【问题描述】:
假设我有一个 Player 类,它有一些成员函数。其中之一使用 this 关键字返回对象的指针。 Player* getPlayer() { return this;};
class Player
{
public:
Player(int id, string name, int score = 0) : pId(id), pName(name), pScore(score) { };
void rollDice();
int getId() { return pId; }
int getScore() { return pScore; }
string getName() { return pName; }
Player* getPlayer() { return this;};
private:
int pId;
std::string pName;
int pScore;
unsigned char playerDiceRolled;
Dice mDice;
};
我还有一个名为 Game 的类,它使用一个函数将任何玩家的信息保存在不同的向量中。其中一个向量保存了对象向量 playerList 的指针;
class Game
{
public:
void Winer();
void addPlayer(Player A) ;
void updateScore();
vector<Player*> playerList;
vector<int> idList;
vector<string> nameList;
vector<size_t> scoreList;
};
void Game::addPlayer(Player A)
{
this->playerList.push_back(A.getPlayer());
this->idList.push_back(A.getId());
this->nameList.push_back(A.getName());
this->scoreList.push_back(A.getScore());
}
我的问题是我可以从那个向量中取出指针并用它来调用那个类的函数并返回 wright 值。
我试过了,还是不行
我可以看到 Player 的其他值已正确保存,但是当我使用指针调用函数以获取值时,它返回 null。 例如
int main()
{
Game Game1;
Player A(0, "Player1");
Player B(1, "Player2");
Game1.addPlayer(A);
Game1.addPlayer(B);
cout << "Name is:" << Game1.nameList[1] << "\n";
cout << "Name is:" << Game1.playerList[1]->getName() << "\n";
return 0;
}
cout 为 Game1.nameList[1] 提供玩家的赖特名称,但为 NULL 值 Game1.playerList[1]->getName()
【问题讨论】:
-
addPlayer(Player A)获取 Player 对象的副本。A的副本在方法addPlayer的末尾被破坏。使用this->playerList.push_back(A.getPlayer());,您可以将指针保存到向量中的临时对象。 -
您可以使用 ref 运算符
&而不是 getPlayer。你可以直接将指针传递给对象。然后您可以使用一种称为智能指针的模式来确保您不会破坏正在使用的对象。看看unique_pr 和shared_ptr。 -
Player::getPlayer完全是多余的。如果你有一个指向Player的指针,你已经有了getPlayer的结果。如果你引用了Player,那么已经有&或std::addressof做同样的事情
标签: c++