Не сохраняются значения в 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 шт):
В коде жестокая рекурсия. Не надо так.
Но даже не смотря на все это - есть одно место, где добавляется в массив - функция prepareText, но по выходу с функции, объект Game разрушается и вектор очиститься (такова суть с++ - RAII).
Так как нет других мест, где этот вектор используют, предположу, что @Егор надеялся, что при каждом заходе в функцию, массив будет увеличиваться на два элемента (больше просто нет вариантов). В целом, можно сделать, что бы оно так работало - либо сделать объект Games глобальным, либо объявить в функции с модификатором static. Но оба варианта весьма странные.
Ещё в коде много странных мест. К примеру
string* inp = new string;
getline(cin, *inp);
выделям память, получаем строку... а освобождать память ? Может лучше написать так
string inp;
getline(cin, inp);
и с++ сам побеспокоится о освобождении памяти.
В функции add зачем то создается объект Games Game;, который никак не используется.