C/C++

Почему вектор не запоминает ссылки?

Заполняю вектор ссылками (через конструктор) все ок, но когда вызываю метод v.show(); выводит мусор, что не так? где ошибка?

Class Vector
{

public:
int MAX_SIZE = 35;
std::vector beg;
Vector(int a)
{
if (a > MAX_SIZE)
{
throw "Вы не можете создавать массив более чем 35 элеметнов ";
}
else
{
beg.resize(a);
int z = beg.size();
for (int i = 0; i < z; i++)
{
this->beg.push_back(&a);
}
}

}

int* operator[](int a)
{
if (a > MAX_SIZE)
{
throw "Такого элемента не существует";
}
else if (a < 0)
{
throw "Отрицательного элемета быть не может!";
}
else
{
return beg[a];
}
}

void operator()()
{
std::cout << "Размер вашего массива " << beg.size() << std::endl;
}

std::vector<const int*,std::allocator> operator+()
{
std::vector beg2(beg.size());
for (int i = 0; i < beg.size(); i++)
{
beg2[i] = const_cast(this->beg[i]);
std::cout << beg2[i] << std::endl;
std::cout << typeid(beg2[i]).name() << std::endl;
}

return beg2;
}

void operator-(int n)
{
for (int i = 0; i < n; i++)
{
beg.pop_back();
}
std::cout << "последний элемент вектора удален " << n << " раз (а)" << std::endl;
}

void show()
{
int x = 15;
for (int i = beg.size()-1; i > x; i--)
{
std::cout << *(this->beg[i]) << std::endl;
}
}

};

int main()
{

Vector v(15);
v.show();
v.operator-(10);
std::cout << "====================" << std::endl;
v.show();

}
1. Создать массив или вектор ссылок невозможно в принципе.

2. Если размер std::vector установлен, то заполнять его нужно через индексатор, потому что метод push_back() добавляет элемент в его конец вектора. То есть если вы создали вектор через конструктор на 15 элементов, то после вызова push_back() у вас станет 16 элементов в векторе и каждый такой вызов будет увеличивать его размер на один элемент. Не думаю, что вы ожидаете такого поведения.

3. Вы создаёте класс вектор на основе стандартного контейнера std::vector. К чему такие извращения? Возможно от вас ждут реализации пользовательского вектора через динамический массив.

4. вызов метода pop_back() допустим только в том случае, если вектор хранит хотя бы один элемент. Попытка удалить элемент из пустого вектора чревата неопределённым поведением. Поэтому перед удалением элемента из вектора его следует проверять на пустоту используя метод empty(), который возвращает true, если вектор пуст и false в противном случае.

5. Для итерации по всем элементам вектора рекомендуется использовать for-based range цикл.

6. Для вывода вектора в обратном порядке обычно используют обратные итераторы.
Александр Кукуля
Александр Кукуля
67 053
Лучший ответ
Павел Сляднев пойду погуглю про for-based range)
спасибо!
он запоминает ссылки, вопрос что ты туда пишешь.

C работает таким образом, что аргументы функции, переданные по значению, не берутся из контекста, в котором ты функцию вызываешь, а конструируются копированием на стеке функции. при выходе из контектса твоего конструктора, его стек очищается, включая int, на который ты сослался. потому неизбежно там будет мусор. а чтобы был не мусор, переменную нужно передавать не значением, а ссылкой. тогда она будет из контекста вызова функции. это раз.

сам тип у тебя кривой. посмотри как пишутся конструкторы, деструкторы, управление ресурсами etc в примерах. это два.

не нужно придумывать велосипед, который давно придуман. он точно будет хуже. :) лучше научись грамотно использовать имеющийся. это три.
beg.resize(a);
int z = beg.size();

замени на
int z = a;

хотя дальше полный бред
this->beg.push_back(&a);

это ты в вектор пихаешь адреса локальной переменной. мусор, короче
R0
R@m@z@n 0M@rbek0V
5 315
Павел Сляднев ааа я понял, спасибо!