Не сохраняются значения в vector после выхода из функции

using namespace std;
class Games {

private:
    vector<string> TitleVect;

public:
    int arrs_size = 0;

    
    void addSize() {
        
        cout << "adding size..." << endl;
        arrs_size += 1;
        cout << "size from class: " << arrs_size << endl;
    }

    void del() {
        TitleVect.clear();
        arrs_size = 0;
    }
    void add(string title) {
        cout << "adding..." << endl;
        Games Game;
        TitleVect.push_back(title);
        Games::addSize();
        cout << "\tadding the value....     value is " << arrs_size << endl;
    }
    void printAll() {
        cout << "Items:" << endl;
        cout << "arr_size: " << arrs_size << endl;
        if (arrs_size == 0) {
            cout << "You have no notes" << endl;
        }
        else if (arrs_size >= 1) {
            cout << arrs_size << endl;
            for (int i = 0; i < arrs_size; i++) {
                cout << "I: " << i << endl;
                cout << "\t" << TitleVect[i] << endl;
            }

        }
    }
    void remove(int index, string title) {
        TitleVect[index] = title;
    }

};

#pragma region voids
void underMain();
void defPrint();
void prepareText();
void commadPrint();
void commandExecutor();
#pragma endregion


int main() {
    cout << "Main: " << endl;
    underMain();
    return 0;
}
void underMain() {
    
    cout << "underMain: " << endl;
    defPrint();

    commandExecutor();

}


void commandExecutor() {
    cout << "commandExecutor: " << endl;
    string* inp = new string;
    /*cin.clear(); cin.ignore(INT_MAX, '\n');*/
    getline(cin, *inp);
#pragma region regexes
    regex reg_add("^add: ");
    regex reg_del("^delete");
    regex reg_remove("^remove");
#pragma endregion
    if (regex_search(*inp, reg_add)) {
        cout << "reg_add" << endl;
        prepareText();
    }
    else if (regex_search(*inp, reg_del)) {
        cout << "reg_del" << endl;
    }
    else if (regex_search(*inp, reg_remove)) {
        cout << "reg_remove" << endl;
    }
    else {
        cout << "no regex!" << endl;
    }
    underMain();

}


void prepareText() {
    Games Games;
    Games.add("game1");
    Games.add("game2");
    Games.printAll();
    underMain();
}

#pragma region prints voids
void defPrint() {
    cout << "enter some commands" << "\t" << "you can see a command list, write \"command\" or \"commands\" " << endl;
}
void commadPrint() {
    cout << "\tAllcommands:" << "\n\t\t\"commands\": shows you a list of commands\n"
        << "\n\t\t\"add\": add a note\t usage: \"add:(note)\"\n"
        << "\n\t\t\"delete\": deletes all notes\t usage: \"delete:(after showing list, select the number)\"\n"
        << "\n\t\t\"remove\": remove selected notes\t usage: \"remove:(after showing list, select the number)\"\n"
        << endl;
}
#pragma endregion

Ответы (1 шт):

Автор решения: KoVadim

В коде жестокая рекурсия. Не надо так.

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

Так как нет других мест, где этот вектор используют, предположу, что @Егор надеялся, что при каждом заходе в функцию, массив будет увеличиваться на два элемента (больше просто нет вариантов). В целом, можно сделать, что бы оно так работало - либо сделать объект Games глобальным, либо объявить в функции с модификатором static. Но оба варианта весьма странные.

Ещё в коде много странных мест. К примеру

string* inp = new string;
getline(cin, *inp);

выделям память, получаем строку... а освобождать память ? Может лучше написать так

string inp;
getline(cin, inp);

и с++ сам побеспокоится о освобождении памяти.

В функции add зачем то создается объект Games Game;, который никак не используется.

→ Ссылка