Я делаю проект для школы, и он требует конструктора копирования, деструктора и т. Д. Когда я использую конструктор копирования, выдается сообщение о том, что массив пуст, я предполагаю, что конструктор копирования не работает.
Когда я удаляю конструктор копирования, программа работает, что означает, что проблема, вероятно, возникает в этой функции.
template<class T>
class DynArray {
public:
DynArray<T>(){
ptr = new T[Capacity];
this->Capacity = 2;
this->Size = 0;
}
DynArray<T>(T n) {
ptr = new T[Capacity];
this->Capacity = n;
this->Size = 0;
}
DynArray<T>(const DynArray& orig) {
cout << "Copy" << endl;
ptr = new T[Size];
*ptr = *(orig.ptr);
}
DynArray<T>& operator=(const DynArray<T>& orig) {
if(this != &orig) {
delete[] ptr;
ptr = new T[Size];
*ptr = *(orig.ptr);
}
return *this;
}
void push_back(const T& n) {
if (Size >= Capacity) {
adjust(Capacity * 2);
}
ptr[Size] = n;
Size++;
}
void adjust(T a) {
cout << "grow" << endl;
T* arr = new T[a];
for (int i = 0; i < Capacity; ++i) {
arr[i] = ptr[i];
}
Capacity = a;
ptr = arr;
}
T& back() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[Size - 1];
}
T& front() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[0];
}
private:
T* ptr = nullptr;
int Capacity;
int Size;
main:
#include <iostream>
#include "dynarray.h"
using namespace std;
int main( )
{
const char START = 'A';
const int MAX = 12;
// create a vector of chars
DynArray<char> vectD;
// push some values into the vector
for (int i = 0; i < MAX; i++)
{
vectD.push_back(START + i);
}
// remove the last element
vectD.pop_back();
// add another value
vectD.push_back('Z');
// test memory management
DynArray<char> vectD2 = vectD;
// display the contents
cout << "\n[";
for (int i = 0; i < vectD2.size() - 1; i++)
{
cout << vectD2.at(i) << ", ";
}
cout << "..., " << vectD2.back() << "]\n";
DynArray<char> vectD3;
vectD3 = vectD2;
cout << "\n[";
for (int i = 0; i < vectD3.size() - 1; i++)
{
cout << vectD3.at(i) << ", ";
}
cout << "..., " << vectD3.back() << "]\n";
vectD3.front() = '{';
vectD3.back() = '}';
cout << vectD3.front();
for (int i = 1; i < vectD3.size() - 2; i++)
{
cout << vectD3.at(i) << ", ";
}
cout << vectD3.at(vectD3.size()-2) << vectD3.back() << endl;
}
Позже в моем коде он установленчтобы бросить runtime_error, если Size == 0, он выдает ошибку, означающую, что массив пуст.Правильно ли копирует конструктор копирования?Main нельзя изменить, это дано из проф.
UPDATE : я изменил конструктор копирования, чтобы скопировать все элементы массива, но runtime_error по-прежнему возвращает сообщение о том, чтомассив пуст.
template<class T>
class DynArray {
public:
DynArray<T>(){
ptr = new T[Capacity];
this->Capacity = 2;
this->Size = 0;
}
DynArray<T>(T n) {
ptr = new T[Capacity];
this->Capacity = n;
this->Size = 0;
}
DynArray<T>(const DynArray& orig) {
cout << "Copy" << endl;
ptr = new T[Size];
for (int i = 0; i < Size; i++) {
ptr[i] = orig.ptr[i];
}
}
DynArray<T>& operator=(const DynArray<T>& orig) {
if(this != &orig) {
delete[] ptr;
ptr = new T[Size];
for (int i = 0; i < Size; i++) {
ptr[i] = orig.ptr[i];
}
}
return *this;
}
void push_back(const T& n) {
if (Size >= Capacity) {
adjust(Capacity * 2);
}
ptr[Size] = n;
Size++;
}
void adjust(T a) {
cout << "grow" << endl;
T* arr = new T[a];
for (int i = 0; i < Capacity; ++i) {
arr[i] = ptr[i];
}
Capacity = a;
ptr = arr;
}
T& back() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[Size - 1];
}
T& front() {
if(Size == 0) {
throw runtime_error("Array is empty");
}
return ptr[0];
}
private:
T* ptr = nullptr;
int Capacity;
int Size;