#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class DArray
{
int** a; // Указатель на двумерный массив(матрицу)
int x,y; // размеры массива
public:
//конструкторы:
DArray(); // по умолчанию
DArray(int**,int,int); // основной
DArray(const DArray&); // копирования
/*деструктор (в этом классе явное описание деструктора обязательно, поскольку он должен освободить память, захваченную конструктором): */
~DArray();
/* функция, которая заполняет массив данными из массива-источника: */
void Set_array(int**, int, int);
// функция, которая возвращает указатель на массив:
int** Get_array();
// функции ввода-вывода:
void input();
void output();
};
// Определение функций:
/* Конструктор по умолчанию (создает массив 2*2, заполненный нулями): */
DArray::DArray()
{
x=2; y=2;
// Выделяем память под массив:
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// заполняем массив нулями:
for (int i=0; i<x; i++)
for (int j=0; j<y; j++)
a[i][j]=0;
}
// Основной конструктор (создает массив, заполненный данными из массива-источника):
DArray::DArray(int** aa,int xx,int yy)
{
/* Конструктор использует функцию Set_array(). Поскольку эта функция освобождает память, ранее выделенную под массив, а при вызове конструктора еще текущий массив не определен, показываем это, задавая размеры, равные 0. */
x = y = 0;
Set_array(aa, xx, yy);
}
// Деструктор:
DArray::~DArray()
{
// Освобождаем память, выделенную под элементы массива:
for (int i=0; i<x; i++)
delete []a[i];
// Освобождаем память, выделенную под указатели:
delete []a;
}
void DArray::Set_array(int** aa, int xx, int yy)
{
// Если объект уже существует, удаляем его:
if (x && y)
this->~DArray();
/* Обратите внимание на то, как можно явно вызвать деструктор (хотя это не рекомендуется) */
// Создаем массив таких же размеров, что и массив-источник:
x=xx; y=yy;
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// Заполняем массив данными из массива-источника:
for (int i=0; i<x; i++)
for (int j=0; j<y; j++)
a[i][j]=aa[i][j];
}
// Конструктор копирования:
DArray::DArray(const DArray& obj)
{
//Создаем копию объекта obj:
x=obj.x; y=obj.y;
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// Заполняем созданную копию данными из массива obj:
for (int i=0; i<x; i++)
for (int j=0; j<y; j++)
a[i][j]=obj.a[i][j];
}
// Функция, возвращающая указатель на массив:
int** DArray::Get_array()
{
return a;
}
// функция ввода:
void DArray::input()
{
// Удаляем ранее созданный объект:
if (x && y)
this->~DArray();
do
{
cout << "Задайте количество строк матрицы: ";
cin >> x;
cout << "Задайте количество столбцов матрицы: ";
cin >> y;
} while(x<0||y<0);
// Размещаем массив в памяти:
a = new int* [x];
for (int i=0; i<x; i++)
a[i]=new int [y];
// Считываем элементы с клавиатуры:
for (int i=0; i<x; i++)
{
for (int j=0; j<y; j++)
{
cout << "Задайте значение [" << i << ", " << j <<"] элемента:";
cin >> a[i][j];
}
cout << endl;
}
}
// Функция вывода:
void DArray::output()
{
for (int i=0; i<x; i++)
{
for (int j=0; j<y; j++)
{
cout << setw(4) << a[i][j];
}
cout << endl;
}
}
// Пример программы, использующей класс Darray:
int main()
{
//Настройки шрифтов и региональных стандартов:
if(SetConsoleCP(1251)==0)
//проверка правильности установки кодировки символов для ввода
{
cerr<<"Fialed to set codepage!"<<endl;
}
if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
DArray A, B; //вызывается конструктор по умолчанию (2 раза)
cout<< "Массив по умолчанию: \n";
A.output();
// Создаем массив-источник данных:
int** c;
c = new int* [2];
for (int i=0; i<2; i++)
c[i]=new int[2];
// Инициализируем генератор случайных чисел:
time_t t;
srand((unsigned) time(&t));
/* Заполняем массив случайными целыми числами из диапазона [-100, 100]: */
for (int i=0; i<2; i++)
for (int j=0; j<2; j++)
c[i][j]=-100 + rand() % 201;
B.Set_array(c,2,2);
cout << "Объект, заполненный данными из массива-источника:\n";
B.output();
A.input();
cout << "Массив, введенный с клавиатуры:\n";
A.output();
// пример использования основного конструктора:
DArray C(c, 2, 2);
cout << "Массив, созданный с помощью основного конструктора:\n";
C.output();
//пример использования конструктора копирования:
DArray D(C);
cout << "Массив, созданный с помощью конструктора копирования: \n";
D.output();
// Освобождаем память, выделенную под массив-источник данных:
for (int i=0; i<2; i++)
delete []c[i];
delete []c;
_getch();
return 0;
}