Здравый смысл и критическое мышление в программировании. Введение в программирование оконных (Windows)

Содержание

Слайд 2

Здравый смысл Приобретение ЗС – есть ключевая цель всякого образовательного процесса.

Здравый смысл

Приобретение ЗС – есть ключевая цель всякого образовательного процесса. ЗС

включает в себя: приобретение знаний и умение с ними обращаться в любой возникающей жизненной ситуации, а также готовность нести ответственность за свой выбор, совершаемый поступок.
Обретение ЗС осуществляется путем многократных многообразных опытных попыток:
решить поставленную задачу,
оценить принципиальную возможность или невозможность решения,
самостоятельно поставить задачу и определить ее технические условия.
Слайд 3

Здравый смысл в программировании 1. Осознание своего действия. Ответ на вопрос:

Здравый смысл в программировании

1. Осознание своего действия. Ответ на вопрос: Зачем.
Зачем

я написал этот класс, зачем я вызываю эту функцию здесь и сейчас, зачем мне нужно скрыть данные и надо ли это делать вообще.
В ООП это имеет отношение в первую очередь к:
Нахождению и выбору лучшей (верной, красивой, простой) абстракции,
Осознанию важности сокрытия или разделения информации,
Преимущества полиморфизма и виртуализации поведения.
2. Понимание к чему приведут сделанные шаги. Стратегия последовательных решений.
Выработка такого навыка позволит соотнести написание кода или разработки проекта с предполагаемым результатом.
Это приведет к более осмысленным и ответственным решениям.
Слайд 4

Написание кода и дизайн Код должен нравиться автору! Код должен быть

Написание кода и дизайн

Код должен нравиться автору!
Код должен быть адекватным задаче.
Код

должен привносить смысл в решение.
Лучший код – понятный код. (пусть даже за счет повторов и многословия)
Стремление к выразительной простоте приводит к лучшему коду.
Хорошая читаемость кода – признак его качества.
Слайд 5

Технологии программирования или доверие Доверие определяет возможность и скорость научения (доверие

Технологии программирования или доверие

Доверие определяет возможность и скорость научения (доверие книге,

коду, учителю)
Технологии никогда не способны гарантировать хороший результат, если не опираются на фактор личного доверия.
Доверие возникшей в сознании идеи, решению, методу должно перевешивать технологические требования.
Слайд 6

Навык критического мышления и интуиция Критическое отношение к собственному коду позволит

Навык критического мышления и интуиция

Критическое отношение к собственному коду позволит искать

наилучшее решение. Наилучшее решение – это решение, отвечающее личному эстетическому образцу.
Развитие интуитивного взгляда на решение (проект, схема или код) позволит соотнести стратегию (планирование), решение (реализация) и смысл (красоту).
Слайд 7

Создание windows приложений c++ в visual studio

Создание windows приложений c++ в visual studio

Слайд 8

Виды windows приложений c++ : 1. Приложение Win32 — это классическое

Виды windows приложений c++ :

1. Приложение Win32 — это классическое приложение

Windows на языке C++, которое может использовать встроенные API -Интерфейсы C Windows и (или ) API CRT и API стандартной библиотеки, а также сторонние библиотеки.
Приложение Win32, выполняемое в окне, требует, чтобы разработчик работал явно с сообщениями Windows внутри оконной процедуры Windows. Несмотря на имя, приложение Win32 можно скомпилировать как 32-разрядный (x86) или 64-разрядный (x64) двоичный файл. В интегрированной среде разработки Visual Studio термины x86 и Win32 являются синонимами.
2. Модель COM — это спецификация, которая позволяет программам, написанным на разных языках, взаимодействовать друг с другом. Многие компоненты Windows реализуются как COM-объекты и следуют стандартным правилам COM для создания объектов, обнаружения интерфейса и уничтожения объектов. Использование объектов COM из классических приложений C++ относительно просто, но написание собственного COM-объекта является более сложным. Библиотека активных шаблонов (ATL) предоставляет макросы и вспомогательные функции, упрощающие разработку COM .
Слайд 9

3. Приложение MFC — это классическое приложение Windows, которое использует Microsoft

3. Приложение MFC — это классическое приложение Windows, которое использует Microsoft

Foundation Classes для создания пользовательского интерфейса. Приложение MFC также может использовать компоненты COM, а также API CRT и библиотеки стандартных библиотек. MFC предоставляет объектно-ориентированную оболочку с тонким C++ для циклов оконных сообщений и API Windows. MFC предоставляет удобные вспомогательные классы для управления окнами, сериализации, обработки текста, печати и современных элементов пользовательского интерфейса, таких как лента. Для эффективной работы с MFC вы должны быть знакомы с Win32.
4. Приложение или компонент C++/CLI использует расширения для синтаксиса C++ (как это разрешено стандартом C++), чтобы обеспечить взаимодействие между .NET и машинным кодом C++.
Слайд 10

CLI (англ. Common Language Infrastructure) — спецификация общеязыковой инфраструктуры. Наиболее известными

CLI (англ. Common Language Infrastructure) — спецификация общеязыковой инфраструктуры. Наиболее известными

реализациями этого стандарта являются Microsoft .NET Framework, Mono, DotGNU Portable.NET. Спецификация CLI определяет, в частности, архитектуру исполнительной системы .NET — CLR и сервисы, предоставляемые CLR выполняемым программам, классы, предоставляемые библиотекой BCL, синтаксис и мнемонику общего промежуточного языка (CIL).
Base Class Library, или так называемая .NET FCL (англ. Framework Class Library), сокращённо BCL — стандартная библиотека классов платформы «.NET Framework». Программы, написанные на любом из языков, поддерживающих платформу .NET, могут пользоваться классами и методами BCL — создавать объекты классов, вызывать их методы, наследовать необходимые классы BCL и т. д.
Не все языки, поддерживающие платформу .NET, предоставляют или обязаны предоставлять одинаково полный доступ ко всем классам и всем возможностям BCL — это зависит от особенностей реализации конкретного компилятора и языка.
В отличие от многих других библиотек классов, например, MFC, ATL/WTL или SmartWin, библиотека BCL не является некоей «надстройкой» над функциями операционной системы или над каким-либо API. Библиотеки BCL является органической частью самой платформы .NET Framework, её «родным» API. Её можно рассматривать как API виртуальной машины .NET.
Слайд 11

Приложение C++/CLI может содержать части, работающие в собственном коде, и части,

Приложение C++/CLI может содержать части, работающие в собственном коде, и части,

которые выполняются в .NET Framework с доступом к библиотеке базовых классов .NET. C++/CLI является предпочтительным вариантом при наличии машинного кода C++, который должен работать с кодом, написанным на C# или Visual Basic. Он предназначен для использования в библиотеках DLL .NET, а не в коде пользовательского интерфейса.
Любое классическое приложение в C++ может использовать среду выполнения C (CRT), классы и функции стандартной библиотеки, COM-объекты и открытые функции Windows.
Слайд 12

Классическое приложение Win32 Классическое приложение на C++ — это приложение, которое

Классическое приложение Win32

Классическое приложение на C++ — это приложение, которое имеет

доступ к полному набору интерфейсов API Windows и запускается в окне или в системной консоли.
Win32 API (далее WinAPI) – это набор функций (API – Application Programming Interface), работающих под управлением ОС Windows. Их объявления содержатся в заголовочном файле windows.h.
С помощью WinAPI можно создавать различные оконные процедуры, диалоговые окна, программы и даже игры. Этот интерфейс лежит в основе Windows Forms, MFC, других библиотек.
#include // заголовочный файл, содержащий функции API
// Основная функция - аналог int main() в консольном приложении:
int WINAPI WinMain(HINSTANCE hInstance, // дескриптор экземпляра приложения
HINSTANCE hPrevInstance, // в Win32 не используется
LPSTR lpCmdLine, // нужен для запуска окна в режиме командной строки
int nCmdShow) // режим отображения окна
{
// Функция вывода окна с кнопкой "ОК" на экран
MessageBox(NULL, L"Привет, мир!!!", L"Оконная процедура", MB_OK);
return NULL; // возвращаем значение функции
}
Слайд 13

В начале мы подключаем заголовочный файл windows.h. В нём содержатся все

В начале мы подключаем заголовочный файл windows.h. В нём содержатся все

необходимые API- функции.
WinMain – название функции. Она имеет четыре параметра. Первый из них – HINSTANCE hInstance. hInstance является дескриптором экземпляра окна (это некий код программы, идентификатор, по которой ОС будет отличать её от прочих программ).
Переменная типа LPSTR с именем lpCmdLine используется в том случае, если мы запускаем окно через командную строку с явным указанием дополнительных параметров.
Параметр nCmdShow - целочисленный, определяет способ показа окна. Нужен для функции ShowWindow. Например, с помощью него мы можем развернуть окно на весь экран, сделать его определённой высоты, прозрачным или поверх остальных.
Слайд 14

Слайд 15

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine,

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,

_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// Инициализация глобальных строк
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass (hInstance);
// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow)) {
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT1));
Слайд 16

MSG msg; // Цикл приложения: while (GetMessage(&msg, nullptr, 0, 0)) {

MSG msg;
// Цикл приложения:
while (GetMessage(&msg, nullptr, 0, 0))
{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
} // конец wWinMain
Слайд 17

ATOM MyRegisterClass (HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style

ATOM MyRegisterClass (HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style =

CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
Слайд 18

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // Сохранить

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
hInst = hInstance; // Сохранить

маркер экземпляра в глобальной переменной
HWND hWnd = CreateWindowW (szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow (hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
Слайд 19

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{
switch (message) {
case WM_COMMAND: {
int wmId = LOWORD(wParam);
switch (wmId) {
case IDM_EXIT:
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps); // дальше начинает что-то рисовать
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0); break;
default:
return DefWindowProc(hWnd, message, wParam, lParam); }
return 0; }
Слайд 20

Типы данных в Win32 API BOOL – этот тип данных аналогичен

Типы данных в Win32 API

BOOL – этот тип данных аналогичен bool.

Он также имеет два значения – 0 или 1. Только при использовании WINAPI принято использовать вместо 0 спецификатор NULL.
BYTE – байт, ну или восьмибитное беззнаковое целое число – unsigned char.
DWORD — 32-битное беззнаковое целое: unsigned long int, UINT.
INT – 32-битное целое – long int.
LONG – 32-битное целое – также long int.
NULL – нулевой указатель: void *NULL=0;
UINT – 32-битное беззнаковое целое - unsigned long int, DWORD.
Дескрипторы — это идентификатор какого-либо объекта. Для разных типов объектов существуют разные дескрипторы. Есть дескрипторы кисти, курсора мыши, шрифта и т.д. С их помощью мы можем при инициализации или в процессе работы приложения поменять какие-нибудь настройки, чего, например, мы не могли сделать в консольном приложении. Используются они в описательных функциях, управляющих типа: CreateProcess(), ShowWindow() и т.д. или как возвращаемое значение некоторых функций :
HANDLE h = GetStdHandle(DWORD х);
В этой получаем дескриптор считывания потоков std_in и std_out.
Слайд 21

HANDLE – дескриптор объекта. HBITMAP – дескриптор растрового изображения. HBRUSH –

HANDLE – дескриптор объекта.
HBITMAP – дескриптор растрового изображения.
HBRUSH – дескриптор

кисти.
HCURSOR – дескриптор курсора.
HDC – дескриптор контекста устройства.
HFONT – дескриптор шрифта.
HICONS – дескриптор пиктограммы.
HINSTANCE – дескриптор приложения.
HMENU – дескриптор меню.
HPEN – дескриптор пера.
HWND – дескриптор окна.
Слайд 22

Строковые типы данных Есть два вида кодировок символов: ANSI и UNICODE.

Строковые типы данных
Есть два вида кодировок символов: ANSI и UNICODE. Однобайтные

символы относятся к ANSI, двухбайтные — к кодировке UNICODE.
// создаём строку из 10 элементов:
wchar_t str[10]; // UNICODE
Если же мы хотим использовать кодировку ANSI, то мы традиционно напишем:
char str[10]; // ANSI
LPCSTR – указатель на константную строку
LPCTSTR – указатель на константную строку, без UNICODE.
LPCWSTR – указатель на константную UNICODE строку.
LPSTR – указатель на строку, заканчивающуюся нуль- символом.
LPTSTR – указатель на неконстантную строку, без UNICODE.
LPWSTR – указатель на UNICODE строку.
TCHAR – символьный тип — аналог char и wchar_t.
Слайд 23

Прочие типы LRESULT CALLBACK MyWndProc (HWND hWnd, UINT uMSg, WPARAM wParam,

Прочие типы
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT uMSg,
WPARAM wParam, LPARAM

lParam);
LPARAM – тип для описания lParam (long parameter).
LRESULT – значение, возвращаемое оконной процедурой имеет тип long.
WPARAM – тип для описания wParam (word parameter). Используются вместе с lParam в некоторых функциях.
Слайд 24

Разработка MFC – приложений MFC – ООП с++ библиотека. Библиотека MFC

Разработка MFC – приложений

MFC – ООП с++ библиотека.
Библиотека MFC содержит

большую иерархию классов. В ее вершине находится класс СObject, который содержит различные функции, используемые во время выполнения программы и предназначенные, в частности, для предоставления информации о текущем типе во время выполнения, для диагностики, и для сериализации.
Если указатель или ссылка ссылается на объект, производный от класса CObject, то в этом случае предусмотрен механизм определения реального типа объекта с помощью макроса RUNTIME_CLASS().
Каждый класс, производный от CObject, может по запросу проверить свое внутреннее состояние и выдать диагностическую информацию. Это интенсивно используется в MFC при отладке.
Сериализация - это механизм, позволяющий преобразовать текущее состояние объекта в последовательный поток байт, который обычно затем записывается на диск, и восстановить состояние объекта из последовательного потока, обычно при чтении с диска. Это позволяет сохранять текущее состояние приложения на диске, и восстанавливать его при последующем запуске.
Слайд 25

Некоторые классы порождаются непосредственно от CObject. Наиболее широко используемыми среди них

Некоторые классы порождаются непосредственно от CObject. Наиболее широко используемыми среди них

являются CCmdTarget, CFile, CDC, CGDIObject и CMenu. Класс ССmdTarget предназначен для обработки сообщений.
Класс СFile предназначен для работы с файлами.
Класс CDC обеспечивает поддержку контекстов устройств. В этот класс включены практически все функции графики GDI.
CGDIObject является базовым классом для различных GDI-объектов, таких как перья, кисти, шрифты и другие.
Класс СMenu предназначен для манипуляций с меню.
От класса CCmdTarget порождается очень важный класс CWnd. Он является базовым для создания всех типов окон, включая масштабируемые ("обычные") и диалоговые, а также различные элементы управления. Наиболее широко используемым производным классом является CFrameWnd.
От класса CCmdTarget, через класс CWinThread, порождается CWinApp. Это один из фундаментальных классов, поскольку предназначен для создания самого приложения. В каждой программе имеется один и только один объект этого класса. Как только он будет создан, приложение начнет выполняться.
Слайд 26

Функции-члены в MFC Большинство функций, вызываемых в MFC-программе, являются членами одного

Функции-члены в MFC
Большинство функций, вызываемых в MFC-программе, являются членами одного из

классов, определенных в библиотеке. Большинство функций API доступны через функции-члены MFC. Тем не менее, всегда можно обращаться к функциям API напрямую.
Глобальные функции в MFC
В библиотеке есть ряд глобальных функций. Все они начинаются с префикса Afx. (Когда MFC только разрабатывалась, то проект назывался AFX, Application Framework. После ряда существенных изменений AFX была переработана в MFC, но прежнее название сохранилось во многих идентификаторах библиотеки и в названиях файлов.) Например, очень часто используется функция AfxMessageBox(), отображающая заранее определенное окно сообщения. Но есть и член-функция MessageBox(). Таким образом, часто глобальные функции перекрываются функциями-членами.
Файл AFXWIN.H
Все MFC-программы включают заголовочный файл AFXWIN.H. В нем, а также в различных вспомогательных файлах, содержатся описания классов, структур, переменных и других объектов MFC. Он автоматически подключает большинство заголовочных файлов, относящихся к MFC, в том числе и WINDOWS.H, в котором определены все функции Windows API и другие объекты.
Слайд 27

Слайд 28

Слайд 29

Слайд 30

int CMainFrame::OnCreate (LPCREATESTRUCT lpCreateStruct) { // обработка сообщения WM_CREATE при создании

int CMainFrame::OnCreate (LPCREATESTRUCT lpCreateStruct) {
// обработка сообщения WM_CREATE при создании

главного окна программы
if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// ….
if (!m_wndMenuBar.Create(this))
{
TRACE0("Не удалось создать строку меню\n");
return -1; // не удается создать
}
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0("Не удалось создать панель инструментов\n");
return -1; // не удалось создать
}
Слайд 31

// … // Разрешить операции с пользовательскими панелями инструментов: InitUserToolbars(nullptr, uiFirstUserToolBarId,

// …
// Разрешить операции с пользовательскими панелями инструментов:
InitUserToolbars(nullptr, uiFirstUserToolBarId, uiLastUserToolBarId);
if (!m_wndStatusBar.Create(this))
{
TRACE0("Не

удалось создать строку состояния\n");
return -1; // не удалось создать
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// TODO: удалите эти пять строк, если панель инструментов и строка меню не должны быть закрепляемыми
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
DockPane(&m_wndToolBar);
Слайд 32

// включить режим работы закрепляемых окон стилей Visual Studio 2005 CDockingManager::SetDockingMode(DT_SMART);

// включить режим работы закрепляемых окон стилей Visual Studio 2005
CDockingManager::SetDockingMode(DT_SMART);
// создать

закрепляемые окна
if (!CreateDockingWindows())
{
TRACE0("Не удалось создать закрепляемые окна\n");
return -1;
}
/// ….
// включить быструю (Alt+перетаскивание) настройку панелей инструментов
CMFCToolBar::EnableQuickCustomization();
if (CMFCToolBar::GetUserImages() == nullptr)
{
// загрузить изображения пользовательских панелей инструментов
if (m_UserImages.Load(_T(".\\UserImages.bmp")))
{
CMFCToolBar::SetUserImages(&m_UserImages);
}
}
Слайд 33

// включить персонализацию меню (последние использованные команды) // TODO: определите свои

// включить персонализацию меню (последние использованные команды)
// TODO: определите свои основные

команды так, чтобы каждое раскрывающееся меню содержало по крайней мере одну основную команду.
CMFCToolBar::SetBasicCommands(lstBasicCommands);
// повышает удобство использования панели задач, так как на эскизе отображается имя документа.
ModifyStyle(0, FWS_PREFIXTITLE);
return 0;
} // конец OnCreate
Слайд 34

Разработка Windows Form – приложений (CLR) Шаг-1: Файл - > Новый

Разработка Windows Form – приложений (CLR)

Шаг-1: Файл - > Новый -

> Проект - > Шаблоны - > Visual C++ - > CLR - > CLR Консольное Приложение - > OK.
Шаг-2: Исходные файлы - > Добавить новый элемент - > Visual C++ - > UI -> Windows формы (MyForm.h) - > добавить.
Шаг 3: В дереве слева выберите: Свойства проекта = > Компоновщик = > система. А справа от окна свойств установите "SubSystem" как " Windows (/SUBSYSTEM:WINDOWS)
Шаг 4: Указать точку входа: функцию main.
Слайд 35

_

_

Слайд 36

_

_

Слайд 37

Слайд 38

Слайд 39

_

_

Слайд 40

Заменить код в файле, содержащем главную функцию приложения на этот: #include

Заменить код в файле, содержащем главную функцию приложения на этот:
#include "MyForm.h"
using

namespace System;
using namespace System::Windows::Forms;
[STAThread]
void main(array^ args)
{
// обратите внимания на эти крышечки у array^ args
// это тип указателей в системе .NET
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
WF1test::MyForm form;
Application::Run(% form);
}
Слайд 41

Слайд 42

Слайд 43

Еще раз напомню о правиле 3-х Правило трёх — правило в

Еще раз напомню о правиле 3-х

Правило трёх — правило в C++,

гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода:
Деструктор
Конструктор копирования
Оператор присваивания копированием
Слайд 44

И еще раз об операторе присваивания копированием: operator= MyClass& operator= (const

И еще раз об операторе присваивания копированием: operator=

MyClass& operator=

(const MyClass& obj) {
if ( this == & obj) return *this;
DeleteData( );
// что-то копируется из внешнего obj в уже существующий this->obj
CopyData (obj);
return *this;
}
Обратите внимание, что в существующем объекте уже может что-то находиться. Это надо все удалить. Также присвоен может быть объект сам себе: надо проверить на самокопирование.
Слайд 45

Домашнее задание на неделю Проект 29. Создать абстрактный базовый класс именем

Домашнее задание на неделю

Проект 29. Создать абстрактный базовый класс именем своей

фамилии, записанной латиницей. Например: Ivanov.
Создать 2 производных класса с именами измененного имени базового класса с суффиксами вида «_1» и «_2». Например: Ivanov_2. Первый класс наследуется от базового, а второй – от первого.
В первом классе есть член данных типа int*. Положить туда по умолчанию число 33.
Создать также отдельно от иерархии класс базы данных DB, в котором разместить член-данных типа vector.
В функции main создать в динамической памяти по 2 объекта типов созданных классов. Положить их в DB* db1= new DB . Затем, в глобальной функции change изменить значение 33 на 55 в db1 только у объектов типа _1.
Далее реализовать, чтобы правильно работал, следующий в main код:
DB db2 (* db1);
delete db1;
DB db3;
db3 = db2;
Вывести на консоль данные из db3. Убедиться, что выводит 55, а не 33.
Проверить на утечку памяти.