0

単純なゲーム ロビー プログラム (実際のネットワークではなく、単なるシミュレーション) を作成しようとしていますが、プログラムのテスト中に実行時エラーが発生し、修正方法がわかりません。(私はプログラミングにかなり慣れていません。)

私のエラーは、ロビーに新しいプレーヤー ノードを作成するときに、入力した最初の 2 つのプレーヤー名をプログラムが受け入れますが、3 回目の試行で新しい名前を入力して Enter キーを押すと、カーソルが新しい行に移動することです。新しいノードに入る代わりに。問題は Lobby::Add 関数のどこかにあると思われますが、どこにあるのかわかりません。ヘルプやアイデアをいただければ幸いです。ありがとうございます=)。

#include <iostream>
#include <string>

using namespace std;

class Player
{
public:

    Player(const string& name = "");
    string GetName() const;
    Player* GetNext() const;
    void SetNext(Player* next);

private:
    string m_Name;
    Player* m_pNext;
};

Player::Player(const string& name):
    m_Name(name),
    m_pNext(0)
{}

string Player::GetName() const
{
    return m_Name;
}

Player* Player::GetNext() const
{
    return m_pNext;
}

void Player::SetNext(Player* next)
{
    m_pNext = next;
}

class Lobby
{
    friend ostream& operator<<(ostream& os, const Lobby& aLobby);

public:
    Lobby();
    ~Lobby();
    void Add();
    void Remove();
    void Clear();

private:
    Player* m_pHead;
};

Lobby::Lobby():
m_pHead(0)
{}

Lobby::~Lobby()
{
    Clear();
}

void Lobby::Add()
{
    // Create a new player node
    cout << "Please enter the name of new player: ";
    string name;
    cin >> name;
    Player* pNewPlayer = new Player(name);

    //If list is empty make head of list this new player
    if (m_pHead == 0)
    {
        m_pHead = pNewPlayer;
    } 

    else
    {
        Player* pIter = m_pHead;

        while(pIter->GetNext() != 0)
        {
            pIter->GetNext();
        }

        pIter->SetNext(pNewPlayer);
    }
}

void Lobby::Remove()
{
    if(m_pHead == 0)
    {
        cout << "The game lobby is empty, there are no players to remove!\n\n";
    }

    else
    {
        Player* pTemp = m_pHead;
        m_pHead = m_pHead->GetNext();
        delete pTemp;
    }
}

void Lobby::Clear()
{
    while(m_pHead != 0)
    {
        Remove();
    }
}

ostream& operator<<(ostream& os, const Lobby& aLobby)
{
    Player* pIter = aLobby.m_pHead;

    cout << "Here's who is in the game lobby: \n";

    if (pIter == 0)
    {
        cout << "The lobby is empty.\n";
    }

    else
    {
        while(pIter != 0)
        {
            os << pIter->GetName() << endl;
            pIter = pIter->GetNext();
        }
    }

    return os;
}

int main()
{
    Lobby myLobby;
    int choice;

    do
    {
        cout << myLobby;
        cout << "\nWelcome to the game lobby!\n";
        cout << "Please enter a choice.\n";
        cout << "0 - Quit the program.\n";
        cout << "1 - Add a player to the lobby.\n";
        cout << "2 - Remove a player from the lobby.\n";
        cout << "3 - Clear the lobby.\n\n";

        cout << "Choice: ";
        cin >> choice;

        switch(choice)
        {
            case 0: cout << "Goodbye!"; break;
            case 1: myLobby.Add(); break;
            case 2: myLobby.Remove(); break;
            case 3: myLobby.Clear(); break;
            default: cout << "Please enter a valid choice.\n"; break;
        }

    }while(choice != 0);

    return 0;
}
4

1 に答える 1

1

追加すると無限ループになります。を呼び出しGetNext()ましたが、結果を に代入するのを忘れていましたpIter

私は他の人が言ったことに同意する傾向がありますが、デバッガーの使用方法を学ぶ必要があります。また、投稿する前に、問題のあるコードを最小のコードに減らすのにも役立ちます。多くの場合、これで問題を自分で見つけることができます。あなたのコードでは、std::cin人々が何を入力する必要があるかを推測する必要がないように、入力を固定値に置き換える必要があります。

幸運を!

ウリ

于 2013-01-10T18:26:30.487 に答える