文本冒险解析器C++

Text Adventure Parser C++

本文关键字:C++ 冒险 文本      更新时间:2023-10-16

我和合作伙伴在我们的文本冒险游戏中遇到了语法分析器问题。我们不断得到"Segmentation fault(core dumped)"answers"terminate called after through a instance of'std::out_of_range'"what():basic_string::substr中止(核心转储)"错误,我们不知道热修复它。

 void nextTurn(Player *player)
{
    string input;
    Parser *parser;
    cout << player -> getName() << "'s turn: ";
    cin >> input;
    parser -> parse(input);
    delete parser;
}

这就是我们从主类中的玩家那里获得每个玩家在每个回合中想要什么的输入。这是我们的Parser.cpp类。

  #include <iostream>
  #include "Parser.h"
  using namespace std;
  /**
   * Construct a new parser class
   */
  Parser::Parser(Player *p, TownArea *t)
  {
    Parser::player = p;
    Parser::townArea = t;
  }
 /**
 * Parse the input text
 */
  void Parser::parse(string input)
   {
            string action = input.substr(0, input.find(" "));
            //Look around the room
            if(action == "look" || action == "help")
            {
                    cout << "Current Room: " << Parser::townArea -> getName() << endl;
                    cout << Parser::townArea -> getDescription() << endl;
                    return;
            }
            //See player's inventory
            if(action == "inventory" || action == "inv")
            {
                    vector<string> inventory = Parser::player -> getInventory();
                    if(inventory.size() == 0) cout << "Inventory is empty." << endl;
                    else
                    {
                            cout << "Inventory: " << endl << "| ";
                            for(int i = 0; i < inventory.size(); i++)
                            {
                                    cout << inventory[i] << " | ";
                            }
                            cout << endl;
                    }
                    return;
            }
 }
Parser *parser;
cout << player -> getName() << "'s turn: ";
cin >> input;
parser -> parse(input);

您只是声明了Parser类的实例。您未能用new构造它。未定义的行为。

您永远不会分配Parser:

void nextTurn(Player *player)
{
    string input;
    Parser *parser; // this points to nothing!!!!
    parser = new Parser; // now it points to a Parser
    cout << player -> getName() << "'s turn: ";
    cin >> input;
    parser -> parse(input);
    delete parser;
}

然而,在这种情况下,当您在函数末尾简单地delete它时,不需要使用指针。在这种情况下,只需使用一个正常的自动变量,如下所示:

void nextTurn(Player *player)
{
    string input;
    Parser parser; // Don't use a pointer!
    cout << player -> getName() << "'s turn: ";
    cin >> input;
    parser.parse(input);
    // no need to delete here
}

Player可能也是如此。只需创建它的一个普通实例,并通过引用传递它:

void nextTurn(Player& player) // pass reference
{
    string input;
    Parser parser; // Don't use a pointer!
    cout << player.getName() << "'s turn: ";
    cin >> input;
    parser.parse(input);
    // no need to delete here
}

希望能有所帮助。