Как исправить эту ошибку в моем игрушечном классе Vector?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как исправить эту ошибку в моем игрушечном классе Vector?

Сообщение 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_ = 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»