Как я могу сделать переменные моей структуры видимыми из всех функций? - PullRequest
0 голосов
/ 07 ноября 2018

Итак, моим заданием в классе было создание программы на C ++, которая, по сути, создает базу данных с рядом опций (добавление к ней, удаление записей, изменение, поиск и перечисление). Это должно быть сделано специально с массивами, а не векторами или классами или чем-то еще.

Я решил создать несколько функций для каждой опции, чтобы они все вызывали друг друга. После обширного поиска в Google я также решил позволить struct обрабатывать объявления, чтобы я мог использовать их во всех функциях без использования :: marks. Я специально сделал, чтобы все зависело друг от друга, потому что учитель намекнул, что нам нужно будет продолжать работать с ним, поэтому, если я что-то изменю, все остальное изменится, чтобы приспособиться.

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

struct va{

public:
    int i, j, k, l; //for possible loops or variables I only need for a very short time
    int id = 0;
    int name = id+1;
    // like 6 other ints I also declared here, including year2
    int achi = year2+1;
    //The above is for easier identification of pro[whatever][needed data]. The +1 method is to allow for easier editing later.

    int size = 20, row = 0; //This is important for addition
    string searchterm = ""; //this is for searching

public:
    int main();
    void MainMenu();
    void Addition();
    void Deletion();
    void Search();
    void Modify();
    void List();
};

void MainMenu();
void Addition();
void Deletion();
void Search();
void Modify();
void List(); 
//I just find it neater to make side functions after the main one.

int main()
{
    setlocale(LC_ALL, "");


    const int column = achi;
    const int initsize = size; //These two are so I can edit the size of the array from the struct directly
    string pro[initsize][column]; //This creates the array that's the actual database

    cout << endl << "Welcome to the League of Legends Pro Players database!" << endl << endl;
    cout << endl << "Please, use the menu to access its functions.";

    MainMenu();

    cout << endl;
    return 0; 
}

void MainMenu()
{
    cout << endl << "Main Menu" << endl;
    cout << endl << "1: add an entry to the database.";
    cout << endl << "2: delete an existing entry from the database.";
    cout << endl << "3: search for an existing entry in the database.";
    cout << endl << "4: modify an existing entry.";
    cout << endl << "5: list all existing entries." << endl;

    cin  >> i;

    switch(i)
    {
        case 1: Addition();
        case 2: Deletion();
        case 3: Search();
        case 4: Modify();
        case 5: List();
    }
}

(я еще не написал реальные функции для опций.) Однако, когда я попытался запустить его, мне сказали, что 'achi' не был объявлен в main, хотя я обнародовал все, просто так, что я не буду столкнуться с этой ошибкой. Как я могу заставить main "видеть" структуру и ее переменные?

1 Ответ

0 голосов
/ 07 ноября 2018

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

При предоставлении внеклассных определений функций-членов struct va необходимо использовать от va:: до квалификации имен членов, чтобы отличать их от чего-либо еще с таким же именем , Если бы это было не так, то все хорошие имена были бы использованы членами классов в стандартной библиотеке.

Рекомендуется также объявлять переменные в самом узком месте. Не засоряйте элементы данных va вещами, которые могут быть локальными для его функций-членов.

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;

struct va {
    static constexpr int size = 20;
    static constexpr int column = ???;
    std::string pro[size][column];

    void MainMenu();
    void Addition();
    void Deletion();
    void Search();
    void Modify();
    void List();
};

int main()
{
    setlocale(LC_ALL, "");

    va instance;
    cout << endl << "Welcome to the League of Legends Pro Players database!" << endl << endl;
    cout << endl << "Please, use the menu to access its functions.";

    instance.MainMenu();

    cout << endl;
    return 0; 
}

void va::MainMenu()
{
    cout << endl << "Main Menu" << endl;
    cout << endl << "1: add an entry to the database.";
    cout << endl << "2: delete an existing entry from the database.";
    cout << endl << "3: search for an existing entry in the database.";
    cout << endl << "4: modify an existing entry.";
    cout << endl << "5: list all existing entries." << endl;

    int i;
    cin >> i;

    switch(i)
    {
        case 1: Addition();
        case 2: Deletion();
        case 3: Search();
        case 4: Modify();
        case 5: List();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...