Не происходит печать массива в методе класса

Нужно реализовать простенький класс по взаимодействию с массивом. Требуется его заполнение (по требованиям условия получается, что его надо вводить по значениям другого массива, так как сначала нужно полностью ввести элементы, а только потом вызывать конструктор). Срабатывает конструктор, далее программа прекращает работу. В чём причина?

Это хэдер класса:

   #ifndef _MY_MASSIV_H_
#define _MY_MASSIV_H_
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

class MyMassiv
{
public:
    int* arr0;
    int Size;
    MyMassiv(const int SizeOfArr);
    ~MyMassiv();
    void GetMassiv(int* arr, int SizeofArray);
    void PrintMassiv(int SizeofArr);
    void ReverseMassiv();
};
#endif

Реализация класса:

    #include "MyMassiv.h"

MyMassiv::MyMassiv(const int SizeOfArr)
{
    Size = SizeOfArr;
    cout << "N = " << Size << endl;
    int* arr0 = new int[this->Size];
}

MyMassiv::~MyMassiv()
{
    delete[] arr0;
}

void MyMassiv::GetMassiv(int* arr, int SizeofArr)
{   
    for (int i = 0; i < SizeofArr; i++)
    {
        arr0[i] = arr[i];
    }
}

void MyMassiv::PrintMassiv(int SizeofArr)
{
    for (int j = 0; j < SizeofArr; j++)
    {
        cout.width(5);
        cout << arr0[j];
    }
}


void MyMassiv::ReverseMassiv()
{
    for (int k = 0, end = this->Size / 2; k < end; k++)
    {
        int temp = arr0[k];
        arr0[k] = arr0[Size - 1 - k];
        arr0[Size - 1 - k] = temp;
    }
}

Мейн:

  #include <stdlib.h>
#include <stdio.h>
#include "MyMassiv.h"
using namespace std;
int main()
{
    int siz;
    cin >> siz;
    int* arr1 = new int[siz];
    for (int i = 0; i < siz; i++)
    {
        cin >> arr1[i];
    }


    MyMassiv mas(siz);
    mas.GetMassiv(arr1, siz);
    mas.PrintMassiv(siz);
    cout << endl;
    mas.ReverseMassiv();
    mas.PrintMassiv(siz);
}

Результат работы


Ответы (2 шт):

Автор решения: абобус

не знаю почему не работает, попробуй просто с помощью for() вывести.

    for(int i =0; i<siz; ++i){
        cout << arr1[i] << ' ';
    }
    cout << endl;
→ Ссылка
Автор решения: AR Hovsepyan

Хорошо бы написать код размышляя над логикой самого кода. Потому хочется оставить свои замечания:

  1. Имена желательно выбрать в рамке одного языка. У вас есть SizeOfArr, что на английском понятно, а класс и его члены содержат русское слово массив. Код тоже должен быть написан грамотно, как и любая другая инструкция, поэтому немного изменим названия.
  2. Клиенту(пользователю) вашего класса совсем не нужно обращаться к члену_указателю(размер массива может где то еще пригодится), поэтому этот указатель лучше скрыть _ объявить в закрытой части. В представленном виде класс нигде не меняет размер массива, поэтому можно его сделать доступным, но константным, чтобы извне можно было только читать.
  3. Конструктор может сразу выделить память под массив, а вывод в консоль при конструировании объекта, не самая лучшая идея(если это не в учебных целях). Когда Вы инициализируете члены в теле конструктора, то сначала создается объект инициализированным "мусором", а после выполняется присваивание. Инициализируйте члены в списке инициализации конструктора, и они будут создаваться сразу с нужными значениями. А константные объекты только так и можете инициализировать. Автоматически исчезнет и ваша ошибка _ в конструкторе вы не инициализируете член класса, а объявляете другой_локальный указатель int* arr0 = new int[this->Size]; и, при этом, после конструировании еще оставляете не освобожденный участок памяти(тут просто нужно убрать int*, чтобы было воспринято как this->arr0).
  4. Функция_член GetMassiv не является геттером, она инициализирует члены, и поэтому назовите соответствующим образом. И, так как она выполняет инициализацию из другого массива, необходимо обеспечить не выход за пределы копируемого и копирующего массива(можно, например, брать минимальный из переданного и хранящимся). А сам размер должен иметь без знаковый тип с константным модификатором(ни одна функция не меняет его).
  5. Функции_члену PrintMassiv(я изменю имена), не нужно передать размер массива, класс уже хранит размер(другое дело если вы вторым аргументом передадите для возможности вывода не всего массива, но навряд ли это понадобится). Лучше ей передать ссылку на поток вывода, потому что может появится желание выводить куда то еще кроме консоли. В вашей реализации ReverseMassiv, не учитываете четность и нечетность количества элементов, хотя ее реализовать много проще, чем вы пытаетесь(смотри реализацию ниже).

Ко всему этому вы забыли освободить память захваченный в программе под массив arr1. И, так как реализации тривиальны, я не стал разделять их от объявления:

class MyArray
{
    int* arr0;    
public: 
    const unsigned Size;
    MyArray(const unsigned SizeOfArr)
        : Size(SizeOfArr), arr0(new int[SizeOfArr]){}
    ~MyArray() { delete[] arr0; }
    void initialize(int* arr, const unsigned SizeofArr) {
        for (int i = 0; i < std::min(SizeofArr, Size); i++)        
            arr0[i] = arr[i];
    }
    void PrintArray(std::ostream& out) const
    {            
        for (int j = 0; j < Size; j++)
        {
            out.width(5);
            out << arr0[j] << ' ';
        }
        out << std::endl;
    }
    void Reverse() {
        for (int k = 0, end = Size - 1; k < end; ++k, --end)
            std::swap(arr0[k], arr0[end]);
    }
};
int main()
{   
    int siz;
    //cout << "N = ";
    cin >> siz;
    int* arr1 = new int[siz];
    for (int i = 0; i < siz; i++)
    {
        cin >> arr1[i];
    }
    MyArray mas(siz);
    mas.initialize(arr1, siz);
    mas.PrintArray(cout);    
    mas.Reverse();
    mas.PrintArray(cout);
    delete []arr1; 
    return 0;
}
→ Ссылка