Ошибка идентификатора при вызове функции Visual C ++ - PullRequest
1 голос
/ 18 апреля 2020

Я создаю мини-консольную игру, и вдруг она не может быть скомпилирована из-за ошибки «идентификатор не найден» (C3861) во всех функциях. Я думаю, что это не проблема кода, потому что у меня было 2 лихорадки функции это сработало. Теперь ни одна из функций не работает (я пытался переместить все функции перед разделом Virables, где появляется проблема). Вот важная часть кода. Редактировать: проблема только для функций, которые находятся в классе (структура)

#include <iostream>
#include <string>
#include <Windows.h>
#include <cstdlib>
#include <time.h>
#include <random>

using namespace std;


//-------------------------------------------Virables-------------------------------------------//
struct LevelObject
{
    string name;
    string look;
    bool enabled = true;
    bool interactable = false;

    void Interact(string requaierment,string Text,string itemGiven)
    {
        if (interactable == true)
        {
            if (requaierment == "none")
            {
                cout << Text << endl;
                GiveItem(itemGiven);
            }
            else if (ItemCheck(requaierment))
            {
                cout << Text << endl;
                GiveItem(itemGiven);
                RemoveItem(requaierment);
            }
            else
            {
                cout << "You don't have the needed item to do this" << endl;
            }
        }
        else
        {
            cout << "It seems like you can't do anything with this" << endl;
        }
    }
};

struct Item
{
    string name;
    bool isHere = false;
    string description;
};

struct Level
{
    int id = 0;
    string LvlText, Look;
    Item item[5];
    LevelObject Obj[3];
    int foward_level = 100;
    int back_level = 100;
    int left_level = 100;
    int right_level = 100;
};
struct Player
{
    Level CurrentLevel;

    Item inv[20];
};

Player player;
Level level[50];
string Input;
//-------------------------------------------Functions------------------------------------------//

void RemoveItem(string ItemName2)
{
    for (int i = 0; i < 20;)
    {
        if (player.inv[i].name == ItemName2)
        {
            player.inv[i].name = "";
            break;
        }

        i++;
    }
}

bool ItemCheck(string ItemName1)
{
    bool T_F = false;
    for (int i = 0; i < 20;)
    {
        if (player.inv[i].name == ItemName1)
        {
            bool T_F = true;
            break;
        }

        i++;
    }
    return T_F;
}

void TakeItem(string ItemName0)
{
    for (int i = 0; i < 3;)
    {
        if (player.CurrentLevel.item[i].name == ItemName0 && player.CurrentLevel.item[i].isHere == true)
        {
            GiveItem(ItemName0);
            player.CurrentLevel.item[i].isHere = false;
            break;
        }
        if (i == 2)
        {
            cout << "There is no such item" << endl;
        }
        i++;
    }
}

void GiveItem(string ItemName)
{
    for (int i = 0; i < 20;)
    {
        if (player.inv[i].name == "")
        {
            player.inv[i].name = ItemName;
            break;
        }

        i++;
    }
}


void ColorText(std::string Text0, int Color, bool endl)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), Color);
    if (endl == true)
    {
        std::cout << Text0 << std::endl;
    }
    else if (endl == false)
    {
        std::cout << Text0;
    }
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}



void inventory()
{
    ColorText("---------INVENTORY--------", 9, true);
    for (int i = 0; i < 20;)
    {
        if (player.inv[i].name != "")
            cout << "- " << player.inv[i].name << endl;
        i += 1;
    }
    ColorText("--------------------------", 9, true);
}

int main()
{
    while (true)
    {
        cin >> Input;
    }
}

1 Ответ

0 голосов
/ 18 апреля 2020

Проблема в том, что вы используете (вызываете) некоторые из своих функций перед тем, как определить или объявить их (GiveItem и RemovetItem в LevelObject::Interact). Однако вы не можете определить эти функции до того, как определили / объявили структуру Player!

Чтобы обойти эту проблему, вы можете предоставить прототипов функций - это «пустые» объявления функций, которые просто указывают их «форму» (или подписи ). Поместите их в верхнюю часть кода (рекомендуется делать это для всех функций, даже если эти предварительные объявления не являются строго необходимыми). Вот типичный способ сделать это:

// -----------------------------------------Prototypes------------------------------------------//

void RemoveItem(string ItemName2);
bool ItemCheck(string ItemName1);
void TakeItem(string ItemName0);
void GiveItem(string ItemName);
void ColorText(std::string Text0, int Color, bool endl);
void inventory();

//-------------------------------------------Virables-------------------------------------------//

У вас также есть проблема в вашей функции ItemCheck, когда ваша строка bool T_F = true; внутри for l oop объявляет new переменная T_F, которая «скрывает» (и заменяет) переменную с тем же именем, объявленным в области действия уровня функции. Удалите bool из этой строки, чтобы установить значение переменной уровня функции:

bool ItemCheck(string ItemName1)
{
    bool T_F = false;
    for (int i = 0; i < 20;) {
        if (player.inv[i].name == ItemName1) {
            T_F = true;// "bool = T_F = true"; hides (replaces) the other T_F variable!
            break;
        }
        i++;
    }
    return T_F;
}

Кроме того, для получения хороших рекомендаций по кодированию прочитайте это: Почему "используется пространство имен std ;» считается плохой практикой? .

...