Я написал свой собственный игрушечный класс 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