如何解决如何在每次循环迭代中将类的实例数重置为1?
我有一个player
类,用于存储玩家的当前位置,游戏中的玩家人数以及用于存储玩家总数的静态变量,如下所示:
#ifndef PLAYER_H
#define PLAYER_H
#include <ctime>
#include <random>
#include <iostream>
using std::time;
using std::cout;
class Player
{
private:
int m_Player_currentPosition,m_Player_number;
static int m_Player_numberOfPlayers;
public:
Player::Player():m_Player_currentPosition(1) {
m_Player_number = m_Player_numberOfPlayers;
++m_Player_numberOfPlayers;
}
void m_Player_SetPosition();
int m_Player_GetPosition();
int m_Player_GetPlayerNumber() { return m_Player_number; }
void m_Player_SetNumberOfPlayers() { m_Player_numberOfPlayers = 1; }
~Player() { --m_Player_numberOfPlayers; }
};
int Player::m_Player_numberOfPlayers = 1;
#endif
我还有一个game
类,它使用矢量创建一定数量的玩家实例。在我的游戏课程中,计划是使用m_Game_SetPlayers()
成员函数根据用户输入(2-4个玩家之间)创建玩家,并使用m_Game_PrintPlayers()
成员函数打印玩家的详细信息。
#ifndef GAME_H
#define GAME_H
#include <iostream>
#include "Board.h"
#include "Player.h"
using std::cout;
using std::cin;
using std::vector;
class Game {
private:
bool m_Game_quit;
int m_Game_choice;
Board board;
vector<Player> m_Game_players;
public:
Game();
const bool &m_Game_GetQuit() const;
void m_Game_SetPlayers()
{
int numberOfPlayers = 2;
cout << "How many players (2-4)? ";
cin >> numberOfPlayers;
if (numberOfPlayers < 2 || numberOfPlayers > 4) {
numberOfPlayers = 2;
}
m_Game_players.resize(numberOfPlayers);
}
void m_Game_PrintMenu();
void m_Game_PrintInstructions();
void m_Game_GetChoice();
void m_Game_PrintPlayers()
{
cout << '\n';
vector<Player>::iterator iter;
for (iter = m_Game_players.begin(); iter != m_Game_players.end(); ++ iter) {
cout << "Player " << iter->m_Player_GetPlayerNumber() << "'s position: " << iter-
>m_Player_GetPosition() << '\n';
}
}
void Update();
};
#endif // !GAME_H
但是,在我的main
类中,我正在while
循环下调用Game类的更新函数。这是在单独的实现文件中声明的我的游戏更新成员函数,它决定了游戏的控制流程。
void Game::Update()
{
m_Game_GetChoice();
switch (m_Game_choice) {
case 0: cout << "---Bye---\n";
m_Game_quit = true;
break;
case 1:
system("cls");
m_Game_PrintInstructions();
break;
case 2:
system("cls");
m_Game_SetPlayers();
system("cls");
board.m_Board_PrintBoard();
m_Game_PrintPlayers();
m_Game_players[0].m_Player_SetNumberOfPlayers();
break;
default:
cout << "--Invalid Option---\n";
break;
}
}
这是我在主要功能中的while
循环:
#include "Game.h"
int main() {
Game game;
while (!game.m_Game_GetQuit()) {
system("cls");
game.m_Game_PrintMenu();
game.Update();
system("pause");
}
}
当我第一次运行该程序时,它按预期运行。但是,想象一下,如果我从菜单中选择play
选项,然后输入2个播放器,它将创建2个播放器类的实例。在下一个while循环迭代中,我将大小增加到4个播放器,有时也可以完美运行。然后,当我减小尺寸然后再次增大尺寸时,播放器编号不匹配。以下是帮助您理解问题的以下图像:
- 输入1:https://i.stack.imgur.com/reHjE.png
- 输出1:https://i.stack.imgur.com/Dt68V.png
- 输入2:https://i.stack.imgur.com/Xo83c.png
- 输出2:https://i.stack.imgur.com/2Qso6.png
预期的输出是:
- 玩家的位置1:1:
- 玩家的位置2:1
- 玩家的位置3:1
因此,我认为我需要删除实例,但是由于只要处于while循环(How do I manually delete an instance of a class?,http://www.cplusplus.com/forum/beginner/107822/中,就无法删除堆栈存储器上的实例。我以为我会调整向量的大小。它确实调整了向量的大小,但随后没有删除player
类的实例,而是创建了该类的新实例。有没有办法销毁该类在堆栈内存中的所有实例,即使它在范围内也是如此?如果没有,我该如何解决?
我可能/可能没有提供调试此问题所需的代码。因此,如有需要,我已将整个代码附加在https://github.com/F3INTH34RTED/Cpp/tree/master/Beginner/16SnakesAndLadder上。
解决方法
将向量的大小从2增加到3时,只需创建一个新的Player
实例,因此它将创建一个具有下一个数字的玩家。
行
m_Game_players[0].m_Player_SetNumberOfPlayers();
在上一个循环迭代中,将全局计数器设置为1。因此,这个新玩家获得的是数字1,而不是您期望的数字3。您应该能够删除上述行,并且一切都会按预期进行。
在设计注意事项上,当更改播放器数量时完全重新创建向量,并通过构造函数显式为每个播放器提供编号可能是更明智的选择,
void m_Game_SetPlayers()
{
int numberOfPlayers = 2;
cout << "How many players (2-4)? ";
cin >> numberOfPlayers;
if (numberOfPlayers < 2 || numberOfPlayers > 4) {
numberOfPlayers = 2;
}
m_Game_players.clear();
for (int i = 1; i < numberOfPlayers; i++) {
m_Game_players.push_back(Player(i));
}
}
当然要更新Player
构造函数以使其匹配。
您的问题是document.getElementById("myid").value;
在需要调整内部缓冲区大小时会进行复制/移动,而您的(自动生成的默认值)复制/移动构造函数无法处理,例如,您可以这样做:>
std::vector::push_back
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。