Как в С++ связать классы в единое целое через указатели. Часть первая

от автора

Не так давно (меньше полугода) программирование стало моим хобби. Выбрал язык С++ и как в любом учебном процессе, понять нужную информацию бывает иногда очень сложно.

Этот небольшой туториал посвящается таким же как и я, зеленым, не обстрелянным на просторах программирования — новичкам, которые уже смогли понять основную функцию указателя, но все еще слабо понимают, где и как этот указатель можно использовать.

Ну… поехали.

Прежде всего представим, что вы директор небольшой фирмы, которая занимает строительством и сбытом многоквартирных домов. Вот, вы в очередной раз построили дом и минимальная единица в этом доме — отдельная квартира.

Создаем класс — квартира:

// Площадка class level{ private: 	flat* ptrflat[4]; // Массив указателей на 4-ре квартиры public:				   	level (){ 		for (int i(0); i!=4; i++){ 			ptrflat[i] = new flat; // Создаем каждую квартиру. 		} 	}  	int get_S(){ 		int summa (0);  		for (int i(0); i!=4; i++){ 			summa += ptrflat[i] -> get_S(); // Получаем площадь квартиры. 		} 		return summa; // Возвращаем сумму площадей квартиры. 	} 	~level (){ 		delete [] ptrflat; 	} }; // end level; 

Далее наш дом состоит из этажей. В нашем доме их будет 10.

class externy{ // Подъезд class externy{ private: 	level* ptrlevel[10]; // 10 этажей, по 4 квартиры в каждом. public: 	externy (){ 		for (int i(0); i!=10; i++){ 			ptrlevel[i] = new level; // Создаем этажи. 		} 	} 	int get_S(){ 		int summa (0);  		for (int i(0); i!=10; i++){ 			summa += ptrlevel[i] -> get_S(); 		} 		return summa; 	} 	~externy(){ 		for (int i(0); i!=10; i++){ 			ptrlevel[i] -> ~level(); // Освобождаем память. 		} 		delete [] ptrlevel; // Удаляем массив. 	} }; // end amount; 

И наконец, мой… вернее твой дом состоит из трех подъездов 🙂

// Весь дом class sum{ private: 	externy* ptrexterny[3]; // 3 подъезда по 10 этажей, по 4 квартиры на каждом. public: 	sum (){ 		for (int i(0); i!=3; i++){ 			ptrexterny[i] = new externy; // Создаем подъезды. 		} 	} 	int get_S(){ 		int summa (0);  		for (int i(0); i!=3; i++){ 			summa += ptrexterny[i] -> get_S(); 		} 		return summa; 	} 	~sum(){ 		for (int i(0); i!=3; i++){ 			ptrexterny[i] -> ~externy(); // Освобождаем память. 		} 		delete[] ptrexterny; 	} };// end sum; 

Фуф, все классы связали и заключительная нота — главная функция:

int main(){ 	SetConsoleCP (1251); 	SetConsoleOutputCP (1251);  	 	sum myhousrs; // Создаем объект. 	const int cost (70000); // Цена квадратного метра. 	 	std::cout << "Площадь (м2): " << myhousrs.get_S()  << " суммарная стоимость: " << cost * myhousrs.get_S() << std::endl;  	system ("pause"); 	return NULL; }; 

Полный код:

#include <Windows.h> #include <iostream>   // Класс квартиры. class flat{ private: 	double S; // площадь public: 	flat (){ 		S = rand()%40+10; // рандомная площадь квартиры 	} 	int get_S(){ 		return S; // Вернем значение площади, когда нам это будет необходимо. 	} }; // end flat;  // Площадка class level{ private: 	flat* ptrflat[4]; // Массив указателей на 4-ре квартиры public:				   	level (){ 		for (int i(0); i!=4; i++){ 			ptrflat[i] = new flat; // Создаем каждую квартиру. 		} 	}  	int get_S(){ 		int summa (0);  		for (int i(0); i!=4; i++){ 			summa += ptrflat[i] -> get_S(); // Получаем площадь квартиры. 		} 		return summa; 	}  	~level (){ 		delete [] ptrflat; 	} }; // end level;  // Подъезд class externy{ private: 	level* ptrlevel[10]; // 10 этажей, по 4 квартиры в каждом. public: 	externy (){ 		for (int i(0); i!=10; i++){ 			ptrlevel[i] = new level; // Создаем этажи. 		} 	}  	int get_S(){ 		int summa (0);  		for (int i(0); i!=10; i++){ 			summa += ptrlevel[i] -> get_S(); 		} 		return summa; 	}  	~externy(){ 		for (int i(0); i!=10; i++){ 			ptrlevel[i] -> ~level(); // Освобождаем память. 		} 		delete [] ptrlevel; // Удаляем массив. 	} }; // end amount;  // Весь дом class sum{ private: 	externy* ptrexterny[3]; // 3 подъезда по 10 этажей, по 4 квартиры на каждом. public: 	sum (){ 		for (int i(0); i!=3; i++){ 			ptrexterny[i] = new externy; // Создаем подъезды. 		} 	}  	int get_S(){ 		int summa (0);  		for (int i(0); i!=3; i++){ 			summa += ptrexterny[i] -> get_S(); 		} 		return summa; 	}  	~sum(){ 		for (int i(0); i!=3; i++){ 			ptrexterny[i] -> ~externy(); // Освобождаем память. 		} 		delete[] ptrexterny; 	}  };// end sum;    int main(){ 	SetConsoleCP (1251); 	SetConsoleOutputCP (1251);  	 	sum myhousrs; // Создаем объект. 	const int cost (70000); // Цена квадратного метра. 	 	std::cout << "Площадь (м2): " << myhousrs.get_S() << " суммарная стоимость: " << cost * myhousrs.get_S() << std::endl;  	system ("pause"); 	return NULL; }; 

Немного о принципе действия:

Из главной функции мы «заходим» в конструктор класса SUM, который в свою очередь создает несколько классов EXTERNY, EXTERNY создает несколько классов LEVEL, а LEVEL создает несколько классов типа FLAT.

В следующей части постараюсь объяснить наглядно, приведя рисунки и пояснить более точно принцип действия программы 🙂
ссылка на оригинал статьи https://habrahabr.ru/post/326092/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *