使用c ++并尝试"嵌套"一些代码

JFl*_*agg 3 c++ iostream namespaces input std

我目前正在尝试用C++创建一个基本的测验游戏.

当我尝试运行它时,下面的代码抛出一个错误,如果我不在主类中使用answer("answer")而是用实际代码替换它,它就有效.

我想"嵌套"(我不知道技术术语)一些代码,所以我不必每次都写出来,因为你可以看到我希望写任何问题然后回答("回答").

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{
    cout << "QUIZ C++ EDITION!\n";
    cout << "Question 1:\n";
    cout << "What is the colour you get when you mix red and yellow?\n\n";

    question("Orange");

    system("PAUSE");
}

void question(string answer) {
    string input;

    getline(cin, input);

    if (input == answer) {
        cout << "\nCorrectimundo!\n";
    }
    else
    {
        cout << "\nWrongimundo.\n";
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这是一个错误的语法的情况,但IDE没有告诉我错误在哪里,它只发生在我运行程序时.

use*_*301 13

看起来你正试图创造一个功能.我能提供帮助吗?

- Clippy(1997-2007 RIP) 在此输入图像描述

两种方法可以做到这一点.一种是在question首次使用之前提前申报.

void question(string answer);

int main()
{
    ...
    question("Orange")
    ...
}

void question(string answer)
{ ... }
Run Code Online (Sandbox Code Playgroud)

前向声明是对编译器的承诺,question它将在其他地方完全定义,可能在此文件的后面,可能在另一个文件中,可能在库中.但它必须在某处定义或程序将编译,但它不会链接.

另一种是在question它首次使用之前完全定义.

void question(string answer)
{ ... }

int main()
{
    ...
    question("Orange")
    ...
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种方法,因为没有可能陷入这样的陷阱:

void question(int answer);

int main()
{ 
    ...
    question(42)
    ...
}

void question(string answer)
{ ... }
Run Code Online (Sandbox Code Playgroud)

并通过更改前向声明question和忘记更改定义来获取链接器错误.