Заполняю вектор ссылками (через конструктор) все ок, но когда вызываю метод 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();
}
C/C++
Почему вектор не запоминает ссылки?
1. Создать массив или вектор ссылок невозможно в принципе.
2. Если размер std::vector установлен, то заполнять его нужно через индексатор, потому что метод push_back() добавляет элемент в его конец вектора. То есть если вы создали вектор через конструктор на 15 элементов, то после вызова push_back() у вас станет 16 элементов в векторе и каждый такой вызов будет увеличивать его размер на один элемент. Не думаю, что вы ожидаете такого поведения.
3. Вы создаёте класс вектор на основе стандартного контейнера std::vector. К чему такие извращения? Возможно от вас ждут реализации пользовательского вектора через динамический массив.
4. вызов метода pop_back() допустим только в том случае, если вектор хранит хотя бы один элемент. Попытка удалить элемент из пустого вектора чревата неопределённым поведением. Поэтому перед удалением элемента из вектора его следует проверять на пустоту используя метод empty(), который возвращает true, если вектор пуст и false в противном случае.
5. Для итерации по всем элементам вектора рекомендуется использовать for-based range цикл.
6. Для вывода вектора в обратном порядке обычно используют обратные итераторы.
2. Если размер std::vector установлен, то заполнять его нужно через индексатор, потому что метод push_back() добавляет элемент в его конец вектора. То есть если вы создали вектор через конструктор на 15 элементов, то после вызова push_back() у вас станет 16 элементов в векторе и каждый такой вызов будет увеличивать его размер на один элемент. Не думаю, что вы ожидаете такого поведения.
3. Вы создаёте класс вектор на основе стандартного контейнера std::vector. К чему такие извращения? Возможно от вас ждут реализации пользовательского вектора через динамический массив.
4. вызов метода pop_back() допустим только в том случае, если вектор хранит хотя бы один элемент. Попытка удалить элемент из пустого вектора чревата неопределённым поведением. Поэтому перед удалением элемента из вектора его следует проверять на пустоту используя метод empty(), который возвращает true, если вектор пуст и false в противном случае.
5. Для итерации по всем элементам вектора рекомендуется использовать for-based range цикл.
6. Для вывода вектора в обратном порядке обычно используют обратные итераторы.
он запоминает ссылки, вопрос что ты туда пишешь.
C работает таким образом, что аргументы функции, переданные по значению, не берутся из контекста, в котором ты функцию вызываешь, а конструируются копированием на стеке функции. при выходе из контектса твоего конструктора, его стек очищается, включая int, на который ты сослался. потому неизбежно там будет мусор. а чтобы был не мусор, переменную нужно передавать не значением, а ссылкой. тогда она будет из контекста вызова функции. это раз.
сам тип у тебя кривой. посмотри как пишутся конструкторы, деструкторы, управление ресурсами etc в примерах. это два.
не нужно придумывать велосипед, который давно придуман. он точно будет хуже. :) лучше научись грамотно использовать имеющийся. это три.
C работает таким образом, что аргументы функции, переданные по значению, не берутся из контекста, в котором ты функцию вызываешь, а конструируются копированием на стеке функции. при выходе из контектса твоего конструктора, его стек очищается, включая int, на который ты сослался. потому неизбежно там будет мусор. а чтобы был не мусор, переменную нужно передавать не значением, а ссылкой. тогда она будет из контекста вызова функции. это раз.
сам тип у тебя кривой. посмотри как пишутся конструкторы, деструкторы, управление ресурсами etc в примерах. это два.
не нужно придумывать велосипед, который давно придуман. он точно будет хуже. :) лучше научись грамотно использовать имеющийся. это три.
beg.resize(a);
int z = beg.size();
замени на
int z = a;
хотя дальше полный бред
this->beg.push_back(&a);
это ты в вектор пихаешь адреса локальной переменной. мусор, короче
int z = beg.size();
замени на
int z = a;
хотя дальше полный бред
this->beg.push_back(&a);
это ты в вектор пихаешь адреса локальной переменной. мусор, короче
Павел Сляднев
ааа я понял, спасибо!
Похожие вопросы
- Не могу разобраться. Функция удаления отрицательных элементов вектора
- Задание на С++ Тема: Вектор
- С++ Не работает двумерный вектор (std::vector)
- Правильно ли решил задание? Решение задания на тему вектор по С++.
- Правильно ли решено задание по Яндекс практикуму на тему Вектор, урок 4 на языке программирования С++ ?
- Задача по c++ на векторы. Часть программы написана. Нужны правки.
- С++, как оставить без изменений данные в char* который указывает на внутренний буфер вектора?
- Помогите с сортировкой вектора объектов по 3 параметрам
- Задача на максимальное произведение в векторе C++ Где ошибка в коде?
- Помогите поймать дичь!.. Дичь при инициализации вектора!
спасибо!