gpt4 book ai didi

c++ - 当程序预期根据用户输入再次循环时,它反而会导致段错误 : 11

转载 作者:行者123 更新时间:2023-11-30 02:19:35 26 4
gpt4 key购买 nike

我用 C++ 编写了一个简单的剪刀石头布程序,并尝试以这样一种方式实现 main.cpp 文件:玩完游戏后,如果用户想再次玩游戏,系统会要求用户输入。 'y' 的响应应该再次运行程序,允许用户输入另一个名称和移动选择,但是程序只会成功运行一次,然后导致:运行完成:段错误:11。

代码:

主要.cpp

#include <iostream>
#include <string>
#include "rock-paper-scissorss.h"
using namespace std;

void whoWon(string player_move, string computer_move){
if(player_move == "rock"){
if(computer_move == "paper")
cout<<"You chose rock and the computer chose paper, the computer wins!"<<endl;

else if(computer_move == "scissors")
cout<<"You chose rock and the computer chose scissors, you win!"<<endl;

else
cout<<"You chose rock and the computer chose rock, it's a tie!"<<endl;
}

else if(player_move == "paper"){
if(computer_move == "scissors")
cout<<"You chose paper and the computer chose scissors, the computer wins!"<<endl;

else if(computer_move == "rock")
cout<<"You chose paper and the computer chose rock, you win!"<<endl;

else
cout<< "You chose paper and the computer chose paper, it's a tie!"<<endl;
}

else{
if(computer_move == "rock")
cout<<"You chose scissors and the computer chose rock, the computer wins!"<<endl;

else if(computer_move == "paper")
cout<<"You chose scissors and the computer chose paper, you win!"<<endl;

else
cout<<"You chose scissors and the computer chose scissors, it's a tie!"<<endl;
}
}

int main(int argc, char** argv) {

char play_again = 'y';

while(play_again == 'y'){
cout<<"Please enter your name: "<<endl;
string name;
getline(cin,name);
cout<<"Hello "<<name<<", welcome to Rock-Paper-Scissors!"<<endl;

Player player_1(name);

cout<<"Please enter the move you wish to make: "<<endl;
string move;
getline(cin,move);
while(1){
if((move == "rock") || (move == "paper") || (move == "scissors")){

player_1.setMoveChoice(move);
break;
}

else{
cout<<"Invalid move choice! Please enter rock, paper, or scissors"<<endl;
getline(cin,move);
}
}


Computer com_1;
com_1.setMoveChoice();

string p_move = player_1.getMoveChoice();
string c_move = com_1.getMoveChoice();


whoWon(p_move,c_move);



cout<<"Would you like to play again?(y/n)"<<endl;

cin>>play_again;
cout<<"your response was: "<<play_again<<endl;



}



return 0;
}

剪刀石头布.cpp:

#include "rock-paper-scissorss.h"
#include <cstdlib>

Computer :: Computer(){
num_generated = rand() % 3 + 1;
}

void Computer :: setMoveChoice(){
if(num_generated == 1)
move_selected = "rock";

else if(num_generated == 2)
move_selected = "paper";

else
move_selected = "scissors";

}

string Computer :: getMoveChoice(){
return move_selected;
}

Computer :: ~Computer(){

delete this;
}


Player :: Player(string name){
player_name = name;

}

void Player :: setMoveChoice(string choice){
move_selected = choice;
}

string Player :: getMoveChoice(){
return move_selected;
}

Player :: ~Player(){
delete this;
}

剪刀石头布.h:

#ifndef ROCK_PAPER_SCISSORSS_H
#define ROCK_PAPER_SCISSORSS_H

#include <iostream>
#include <string>
using namespace std;



class Computer{

private:
int num_generated;
string move_selected;

public:
Computer();
void setMoveChoice();
string getMoveChoice();
~Computer();
};

class Player{

private:
string move_selected;
string player_name;

public:
Player(string);
void setMoveChoice(string move);
string getMoveChoice();
~Player();
};

#endif /* ROCK_PAPER_SCISSORSS_H */

最佳答案

您的类不需要析构函数,因为它从不显式分配任何资源。删除:

  Computer :: ~Computer(){
delete this;
}

和所有类似的功能。

请注意,即使您的类确实需要析构函数,析构函数也不应调用:

delete this;

因为这将由编译器发出的代码有效地为您执行。析构函数应该只删除您明确分配的资源,在被销毁的对象中,使用new

关于c++ - 当程序预期根据用户输入再次循环时,它反而会导致段错误 : 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50689524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com