Пример 3: Класс, описывающий двумерный массив

#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;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: