我想我试图在我的变量中传递数据错误?新手编码器里面

时间:2013-06-01 02:22:49

标签: c++

我开始学习一些C ++基础知识,我想编写一些代码来练习我学到的东西。我想创建一个类和一些函数。它应该是一个开始文字游戏的标题屏幕,除了没有游戏......但是:P

每当我输入1开始,所以它显示“Good Work”,它在我按下回车后什么都不做。

正确方向的任何一点都会很棒。我一直在看视频和阅读有关功能的教程,它似乎没有涵盖我遇到的问题......

#include <iostream>
#include <string>


using namespace std;

//Function Protos
void keyError();
int userInput(int x);

//class library
class Title
{
    bool nSelect;
    int x;
public:
    void titleScreen()
    {
        while(nSelect)
        {
            cout << "Welcome to Biggs RPG!" << endl << "1. Play 2. Exit" << endl;
            userInput(x);
                if (userInput(1))
                    nSelect = 0;
                else if (userInput(2))
                {
                    cout << "Closing program..." <<endl;
                    nSelect = 0;
                }
                else
                    keyError();
         }
    }
};

int main()
{
Title displayTitle;
displayTitle.titleScreen();

cout << "Good work";
return 0;
}

void keyError()
{
cout << "Meow? Wrong input try again." << endl;
}   

int userInput(int x)
{
x = 0;
cin >> x;
return x;
}

3 个答案:

答案 0 :(得分:2)

您应该将userInput的返回值与1或2进行比较,如下所示:

int userInput(void);

//class library
class Title
{
    bool nSelect;
    int x;
public:
    void titleScreen()
    {
        nSelect = true;
        while(nSelect)
        {
            cout << "Welcome to Biggs RPG!" << endl << "1. Play 2. Exit" << endl;
            x = userInput();
            if (x == 1)
                nSelect = false;
            else if (x == 2)
            {
                cout << "Closing program..." <<endl;
                nSelect = false;
            }
            else
                keyError();
         }
    }
};

并将userInput定义为:

int userInput(void)
{
    int x = 0;
    cin >> x;
    return x;
}

答案 1 :(得分:2)

有许多风格和技术问题。尝试学习The Definitive C++ Book Guide and List中推荐的资源。

这是一个开始......

#include <iostream>
#include <string>

// "using namespace std;" is poor practice. Better to write out std::

/*  Unless you will have two title screens at the same time,
    this should probably be a namespace, not a "singleton" class. */
namespace Title
{
    int nSelect;

    void titleScreen()
    {
        do {
            // prompt for input
            std::cout << "Welcome to Biggs RPG!\n" "1. Play 2. Exit\n";

            // get ready to accept input, even if there was an error before
            if ( ! std::cin ) {
                std::cin.clear(); // tell iostream we're recovering from an error
                std::cin.ignore( 1000, '\n' ); // ignore error-causing input
            }
            // repeat if invalid input
         } while( ! std::cin >> nSelect || ! handleInput( nSelect ) );

不同之处在于您要求输入,然后处理它。每次检查输入 时,您发布的代码都会再次请求输入。

这是一个do … while循环,因此它只执行一次然后重复,只要条件在结尾为真。如果用户提供的输入无效,则! std::cin评估为true。然后C ++的策略是停止返回任何输入,直到你调用std::cin.clear(),这表示你将再次尝试。 ignore然后摆脱无效输入。然后! std::cin >> nSelect尝试读取一个数字,如果该操作成功,则调用handleInput(您必须编写),如果输入无效,则应返回false。因此,如果读取数字失败,或者输入了错误的数字,则循环再次进行。

答案 2 :(得分:0)

我对参数和返回值之间的区别感到困惑。将函数定义为

int userInput(int x) {
  ...

您将值传递给函数(x)并使用return语句返回值。在您的情况下,您不需要将参数传递给您的函数;你需要返回一个值。您可以通过将此值分配给另一个变量来访问此值:

theResult = userInput(123);

但是传递给函数的值是无关紧要的;你不妨使用

int userInput(void) {
  ...

在这种情况下,您可以使用

theResult = userInput();

现在只是为了让您感到困惑,可以将变量的地址作为参数传递给函数。您可以使用它来访问数据(通常是一个“更大”的数据块,如数组或结构),但它也可以用于提供存储返回值的位置。因此

void squareMe(int *x){
    *x*=*x;
}

将返回该位置指向的数字的平方。然后你可以做

int x=4;
squareMe(&x);
cout << x;

将打印出16(!)。这是因为函数查看地址的内容(&amp; x是变量x的地址),并将其自身相乘。

我希望这个解释有所帮助。