Я написал свой собственный игрушечный класс Vector, чтобы лучше понять все происходящие выделения/освобождения и понять, почему семантика перемещения более эффективна. Хотя моя программа основана на MSVS 2022, она не может быть построена только на Compiler Explorer; Я пробовал компиляторы gcc и msvc.
Я хотел бы попросить помощи, чтобы понять, почему мой код даже не собирается. Код возврата 139 не очень полезен.
#include
#include
#include
template
class Vector {
private:
int capacity_;
int size_;
T* ptr_;
public:
Vector() :capacity_{ 0 }, size_{ 0 }, ptr_{ nullptr } {}
Vector(int size) : capacity_{ size }, ptr_{ new T[size] }, size_{ size } {}
Vector(int size, T data) : Vector(size) {
for (int i{ 0 }; i < size; ++i)
ptr_ = data;
}
Vector(std::initializer_list list) {
clear();
for (const T& elem : list)
push_back(elem);
}
//Destructor
~Vector()
{
clear();
}
//Copy constructor
Vector(const Vector& v)
{
if (this == &v)
return;
capacity_ = v.capacity_;
size_ = v.size_;
ptr_ = new T[v.size_];
for (int i{ 0 }; i < v.size_; ++i)
ptr_ = v.ptr_;
}
//Copy assignment operator
Vector& operator=(const Vector& v)
{
if (this != &v)
{
delete[] ptr_;
ptr_ = nullptr;
capacity_ = v.capacity_;
size_ = v.size_;
ptr_ = new T[capacity_];
for (int i{ 0 }; i < v.size_; ++i)
ptr_ = v.ptr_;
}
return *this;
}
T operator[](int i)
{
if (i >= 0 && i < size_)
return ptr_;
else
throw std::out_of_range("Index out of bounds.");
}
T operator[](int i) const
{
if (i >= 0 && i < size_)
return ptr_;
else
throw std::out_of_range("Index out of bounds.");
}
void reserve(int size)
{
if (size_ < capacity_) return;
if (ptr_ == nullptr)
{
size_ = 0;
capacity_ = 0;
}
T* bufferNew = new T[size];
unsigned int l_size = std::min(capacity_, size);
for (int i{ 0 }; i < l_size; ++i)
{
bufferNew = ptr_;
}
if (ptr_ != nullptr)
delete[] ptr_;
ptr_ = bufferNew;
capacity_ = size;
}
void clear()
{
if (ptr_ != nullptr)
delete[] ptr_;
ptr_ = nullptr;
size_ = 0;
capacity_ = 0;
}
int size() const
{
return size_;
}
int capacity()
{
return capacity_;
}
void push_back(const T& elem)
{
if (size_ >= capacity_) {
reserve(capacity_ == 0 ? 1 : capacity_ * 2); // Double the capacity
}
ptr_[size_++] = elem;
}
void pop_back()
{
--size_;
}
T front()
{
if (size_ > 0)
return ptr_[0];
else
throw std::out_of_range("Index out of bounds.");
}
T back()
{
if (size_ > 0)
return ptr_[size_ - 1];
else
throw std::out_of_range("Index out of bounds.");
}
T* getRawPointer()
{
return ptr_;
}
};
template
Vector operator+(const Vector& v1, const Vector& v2)
{
std::cout
Подробнее здесь: https://stackoverflow.com/questions/791 ... ctor-class
Как исправить эту ошибку в моем игрушечном классе Vector? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1730044812
Anonymous
Я написал свой собственный игрушечный класс Vector, чтобы лучше понять все происходящие выделения/освобождения и понять, почему семантика перемещения более эффективна. Хотя моя программа основана на MSVS 2022, она не может быть построена только на Compiler Explorer; Я пробовал компиляторы gcc и msvc.
Я хотел бы попросить помощи, чтобы понять, почему мой код даже не собирается. Код возврата 139 не очень полезен.
#include
#include
#include
template
class Vector {
private:
int capacity_;
int size_;
T* ptr_;
public:
Vector() :capacity_{ 0 }, size_{ 0 }, ptr_{ nullptr } {}
Vector(int size) : capacity_{ size }, ptr_{ new T[size] }, size_{ size } {}
Vector(int size, T data) : Vector(size) {
for (int i{ 0 }; i < size; ++i)
ptr_[i] = data;
}
Vector(std::initializer_list list) {
clear();
for (const T& elem : list)
push_back(elem);
}
//Destructor
~Vector()
{
clear();
}
//Copy constructor
Vector(const Vector& v)
{
if (this == &v)
return;
capacity_ = v.capacity_;
size_ = v.size_;
ptr_ = new T[v.size_];
for (int i{ 0 }; i < v.size_; ++i)
ptr_[i] = v.ptr_[i];
}
//Copy assignment operator
Vector& operator=(const Vector& v)
{
if (this != &v)
{
delete[] ptr_;
ptr_ = nullptr;
capacity_ = v.capacity_;
size_ = v.size_;
ptr_ = new T[capacity_];
for (int i{ 0 }; i < v.size_; ++i)
ptr_[i] = v.ptr_[i];
}
return *this;
}
T operator[](int i)
{
if (i >= 0 && i < size_)
return ptr_[i];
else
throw std::out_of_range("Index out of bounds.");
}
T operator[](int i) const
{
if (i >= 0 && i < size_)
return ptr_[i];
else
throw std::out_of_range("Index out of bounds.");
}
void reserve(int size)
{
if (size_ < capacity_) return;
if (ptr_ == nullptr)
{
size_ = 0;
capacity_ = 0;
}
T* bufferNew = new T[size];
unsigned int l_size = std::min(capacity_, size);
for (int i{ 0 }; i < l_size; ++i)
{
bufferNew[i] = ptr_[i];
}
if (ptr_ != nullptr)
delete[] ptr_;
ptr_ = bufferNew;
capacity_ = size;
}
void clear()
{
if (ptr_ != nullptr)
delete[] ptr_;
ptr_ = nullptr;
size_ = 0;
capacity_ = 0;
}
int size() const
{
return size_;
}
int capacity()
{
return capacity_;
}
void push_back(const T& elem)
{
if (size_ >= capacity_) {
reserve(capacity_ == 0 ? 1 : capacity_ * 2); // Double the capacity
}
ptr_[size_++] = elem;
}
void pop_back()
{
--size_;
}
T front()
{
if (size_ > 0)
return ptr_[0];
else
throw std::out_of_range("Index out of bounds.");
}
T back()
{
if (size_ > 0)
return ptr_[size_ - 1];
else
throw std::out_of_range("Index out of bounds.");
}
T* getRawPointer()
{
return ptr_;
}
};
template
Vector operator+(const Vector& v1, const Vector& v2)
{
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79130184/how-do-i-fix-this-bug-in-my-toy-vector-class[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия