Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”
Цель работы
Изучить принципы инкапсуляции и наследования в C++ путём разработки иерархии классов для моделирования участников сетевого взаимодействия. Освоить создание общего интерфейса через наследование и организацию взаимодействия между объектами-клиентами и объектом-сервером.
Теоретические сведения
Класс и объект
Класс — пользовательский тип данных, объединяющий данные (поля) и методы для их обработки. Объект — конкретный экземпляр класса.
Инкапсуляция
Инкапсуляция — сокрытие внутренних данных объекта и предоставление контролируемого доступа через методы:
Модификаторы доступа
| Модификатор | Доступ из класса | Доступ из производного | Доступ извне |
|---|---|---|---|
private |
Да | Нет | Нет |
protected |
Да | Да | Нет |
public |
Да | Да | Да |
Конструкторы и деструктор
Наследование
Наследование позволяет создавать новые классы на основе существующих:
Взаимодействие объектов
Задание для выполнения
Разработать иерархию классов для моделирования участников сетевого взаимодействия: базовый абстрактный класс «Клиент» и производные от него «TCP-клиент», «UDP-клиент», «WebSocket-клиент», а также класс «Сервер» для управления подключениями.
Требования к программе
- Создать абстрактный базовый класс
NetworkClient:- закрытые поля:
ip(string),port(int),connected(bool) - защищённые поля:
clientName(string),protocol(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
connect(),disconnect(),isConnected(), геттеры для IP и порта - чисто виртуальные методы:
send(const string& data),receive(),getProtocolName()
- закрытые поля:
- Создать производные классы:
TcpClient— дополнительно:timeout(int). Методsend()выводит[TCP] Отправка с гарантией доставки: <data>. Методreceive()возвращает имитацию полученного ответа.UdpClient— дополнительно:packetSize(int). Методsend()выводит[UDP] Быстрая отправка датаграммы: <data>. Методreceive()— имитация приёма датаграммы.WebSocketClient— дополнительно:url(string). Методsend()выводит[WS] Отправка через WebSocket: <data>. Методreceive()— имитация двунаправленного обмена.
- Создать класс
Server:- закрытые поля:
serverIp,serverPort, список подключённых клиентов (vector<NetworkClient*>) - методы:
addClient(NetworkClient*),removeClient(const string& name),broadcast(const string& message)— вызываетsend()для всех подключённых клиентов,listClients()— выводит информацию о всех клиентах,getClientInfo(const string& name)— выводит информацию о конкретном клиенте
- закрытые поля:
- В функции
main():- Создать объект
Server - Создать объекты каждого типа клиента и подключить их к серверу
- Продемонстрировать отправку сообщений через каждого клиента
- Продемонстрировать метод
broadcast()сервера - Вывести список всех клиентов
- Отключить одного клиента и повторить вывод списка
- Создать объект
Пример ожидаемого вывода
=== Подключение клиентов ===
[Server] Клиент WebApp подключен (TCP, 192.168.1.10:8080)
[Server] Клиент SensorHub подключен (UDP, 192.168.1.20:9090)
[Server] Клиент ChatPanel подключен (WS, 192.168.1.30:443)
=== Отправка сообщений ===
[TCP] Отправка с гарантией доставки: GET /api/data
[UDP] Быстрая отправка датаграммы: temperature:25.5
[WS] Отправка через WebSocket: {"action":"subscribe"}
=== Broadcast сервера ===
[TCP] Отправка с гарантией доставки: Системное уведомление: перезагрузка
[UDP] Быстрая отправка датаграммы: Системное уведомление: перезагрузка
[WS] Отправка через WebSocket: Системное уведомление: перезагрузка
=== Список клиентов ===
1. WebApp | TCP | 192.168.1.10:8080 | Подключен
2. SensorHub | UDP | 192.168.1.20:9090 | Подключен
3. ChatPanel | WS | 192.168.1.30:443 | Подключен
=== Отключение клиента ===
[Server] Клиент SensorHub отключен
=== Обновленный список ===
1. WebApp | TCP | 192.168.1.10:8080 | Подключен
2. ChatPanel | WS | 192.168.1.30:443 | Подключен
Индивидуальные задания
Вариант 1. Почтовые серверы
Базовый абстрактный класс MailServer:
- закрытые поля:
domain(string),port(int),sslEnabled(bool) - защищённые поля:
provider(string),protocol(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
start(),stop(),isRunning(), геттеры - чисто виртуальные методы:
sendMail(),checkMail(),getServerType()
Производные классы:
SMTPServer— дополнительно:mailLimit(int). МетодsendMail()выводит[SMTP] Отправка через <domain>:<port>.POP3Server— дополнительно:mailboxCount(int). МетодcheckMail()выводит[POP3] Проверка <n> ящиков на <domain>.IMAPServer— дополнительно:folderSupport(bool). МетодcheckMail()выводит[IMAP] Синхронизация папок на <domain>.
Класс MailManager:
- закрытые поля:
managerName,vector<MailServer*> servers - методы:
addServer(),broadcast(const string& notice),listServers(),removeServer()
Вариант 2. Сетевые сканеры уязвимостей
Базовый абстрактный класс VulnScanner:
- закрытые поля:
ip(string),targetRange(string),status(bool),scanCount(int) - защищённые поля:
scannerName(string),scanType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
start(),stop(),isRunning(), геттеры - чисто виртуальные методы:
scan(const string& target),getResults(),getScannerTypeName()
Производные классы:
PortScanner— дополнительно:portRange(string). Методscan()выводит[PortScan] Сканирование портов: <target>. МетодdetectServices()— обнаружение сервисов.WebScanner— дополнительно:depth(int). Методscan()выводит[WebScan] Анализ: <target>. МетодcheckXSS()— проверка на XSS.NetScanner— дополнительно:subnetMask(string). Методscan()выводит[NetScan] Обзор сети: <target>. МетодmapTopology()— построение топологии.
Класс SecurityAudit:
- закрытые поля:
auditName,vector<VulnScanner*> scanners - методы:
addScanner(),removeScanner(),scanAll(),listScanners(),getScannerInfo()
Вариант 3. Сетевые принтеры
Базовый абстрактный класс Printer:
- закрытые поля:
ip(string),model(string),status(bool),tonerLevel(int) - защищённые поля:
printerName(string),type(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
powerOn(),powerOff(),isOnline(), геттеры - чисто виртуальные методы:
print(const string& document),getSpecs(),getTypeName()
Производные классы:
LaserPrinter— дополнительно:printSpeed(intстр/мин). Методprint()выводит[Laser] Печать: <document>. МетодprintPage()— печать страницы.InkjetPrinter— дополнительно:colorSupport(bool). Методprint()выводит[Inkjet] Печать: <document>. МетодprintPhoto()— печать фото.LabelPrinter— дополнительно:tapeWidth(int). Методprint()выводит[Label] Печать этикетки: <document>. МетодprintLabel()— печать этикетки.
Класс PrintOffice:
- закрытые поля:
officeName,vector<Printer*> printers - методы:
addPrinter(),removePrinter(),printAll(const string& doc),listPrinters(),getPrinterInfo()
Вариант 4. Веб-серверы
Базовый абстрактный класс WebServer:
- закрытые поля:
ip(string),port(int),os(string),status(bool) - защищённые поля:
serverName(string),engine(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
boot(),shutdown(),isRunning(), геттеры - чисто виртуальные методы:
handleRequest(const string& request),getInfo(),getEngineName()
Производные классы:
ApacheServer— дополнительно:version(string),configPath(string). МетодhandleRequest()выводит[Apache] Обработка: <request>. Методrestart()— перезапуск.NginxServer— дополнительно:workerProcesses(int). МетодhandleRequest()выводит[Nginx] Обработка: <request>. МетодreloadConfig()— перезагрузка конфигурации.IIServer— дополнительно:appPoolCount(int). МетодhandleRequest()выводит[IIS] Обработка: <request>. МетодdeployApp()— развёртывание приложения.
Класс ServerFarm:
- закрытые поля:
farmName,vector<WebServer*> servers - методы:
addServer(),removeServer(),deployToAll(),listServers(),getServerInfo()
Вариант 5. Базы данных
Базовый абстрактный класс Database:
- закрытые поля:
dbName(string),host(string),port(int),status(bool) - защищённые поля:
instanceName(string),dbType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
connect(),disconnect(),isConnected(), геттеры - чисто виртуальные методы:
execute(const string& sql),getStats(),getTypeName()
Производные классы:
MySQL— дополнительно:version(string). Методexecute()выводит[MySQL] Выполнение: <sql>. Методquery()— выполнение запроса.PostgreSQL— дополнительно:extensions(vector<string>). Методexecute()выводит[PostgreSQL] Выполнение: <sql>. Методbackup()— создание резервной копии.SQLite— дополнительно:dbFilePath(string). Методexecute()выводит[SQLite] Выполнение: <sql>. Методoptimize()— оптимизация БД.
Класс DBCluster:
- закрытые поля:
clusterName,vector<Database*> databases - методы:
addDatabase(),removeDatabase(),executeOnAll(),listDatabases(),getDatabaseInfo()
Вариант 6. VPN-шлюзы
Базовый абстрактный класс VPNGateway:
- закрытые поля:
ip(string),protocol(string),country(string),status(bool) - защищённые поля:
gatewayName(string),vpnType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
activate(),deactivate(),isActive(), геттеры - чисто виртуальные методы:
handleConnection(const string& target),getDetails(),getTypeName()
Производные классы:
OpenVPN— дополнительно:listenPort(int). МетодhandleConnection()выводит[OpenVPN] Подключение к: <target>. Методconnect()— установка соединения.WireGuard— дополнительно:publicKey(string). МетодhandleConnection()выводит[WireGuard] Туннель к: <target>. Методtunnel()— создание туннеля.IPSecVPN— дополнительно:cipher(string). МетодhandleConnection()выводит[IPSec] Установка туннеля к: <target>. Методestablish()— установка защищённого соединения.
Класс VPNManager:
- закрытые поля:
managerName,vector<VPNGateway*> gateways - методы:
addGateway(),removeGateway(),connectAll(const string& target),listGateways(),getGatewayInfo()
Вариант 7. IoT-устройства
Базовый абстрактный класс IoTDevice:
- закрытые поля:
deviceId(string),ip(string),deviceType(string),status(bool) - защищённые поля:
deviceName(string),category(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
registerDevice(),unregisterDevice(),isRegistered(), геттеры - чисто виртуальные методы:
performAction(const string& command),getDeviceInfo(),getCategoryName()
Производные классы:
TemperatureSensor— дополнительно:currentReading(double),threshold(double). МетодperformAction()выводит[TempSensor] Команда: <command>. МетодreadValue()— получение показаний.SmartLamp— дополнительно:brightness(int),color(string). МетодperformAction()выводит[SmartLamp] Команда: <command>. Методtoggle()— переключение состояния.SecurityCamera— дополнительно:resolution(string). МетодperformAction()выводит[Camera] Команда: <command>. Методrecord()— начало записи.
Класс SmartHome:
- закрытые поля:
homeName,vector<IoTDevice*> devices - методы:
addDevice(),removeDevice(),sendCommandToAll(),listDevices(),getDeviceInfo()
Вариант 8. DNS-серверы
Базовый абстрактный класс DNSServer:
- закрытые поля:
ip(string),domain(string),serverType(string),status(bool) - защищённые поля:
serverName(string),dnsRole(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
start(),stop(),isRunning(), геттеры - чисто виртуальные методы:
resolve(const string& hostname),getConfig(),getRoleName()
Производные классы:
PrimaryDNS— дополнительно:zones(vector<string>). Методresolve()выводит[Primary] Разрешение: <hostname>. МетодaddRecord()— добавление записи.SecondaryDNS— дополнительно:masterServer(string). Методresolve()выводит[Secondary] Разрешение: <hostname>. Методsync()— синхронизация с мастером.CachingDNS— дополнительно:cacheSize(int). Методresolve()выводит[Cache] Разрешение: <hostname>. Методlookup()— поиск в кэше.
Класс DNSManager:
- закрытые поля:
managerName,vector<DNSServer*> servers - методы:
addServer(),removeServer(),resolveOnAll(),listServers(),getServerInfo()
Вариант 9. Файловые серверы
Базовый абстрактный класс FileServer:
- закрытые поля:
ip(string),os(string),diskCapacity(int),status(bool) - защищённые поля:
serverName(string),protocol(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
mount(),unmount(),isMounted(), геттеры - чисто виртуальные методы:
handleFile(const string& filename),getCapacity(),getProtocolName()
Производные классы:
FTPServer— дополнительно:maxUsers(int). МетодhandleFile()выводит[FTP] Обработка файла: <filename>. Методupload()— загрузка файла.SMBServer— дополнительно:sharedFolders(int). МетодhandleFile()выводит[SMB] Обработка файла: <filename>. Методshare()— предоставление общего доступа.NASServer— дополнительно:raidLevel(int). МетодhandleFile()выводит[NAS] Обработка файла: <filename>. МетодconfigureRAID()— настройка RAID.
Класс StorageManager:
- закрытые поля:
managerName,vector<FileServer*> servers - методы:
addServer(),removeServer(),distributeFile(),listServers(),getServerInfo()
Вариант 10. Фаерволы
Базовый абстрактный класс Firewall:
- закрытые поля:
name(string),interface(string),status(bool),ruleCount(int) - защищённые поля:
firewallType(string),vendor(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
enable(),disable(),isEnabled(), геттеры - чисто виртуальные методы:
applyRule(const string& rule),getRules(),getTypeName()
Производные классы:
NetworkFirewall— дополнительно:zone(string). МетодapplyRule()выводит[NetworkFW] Правило: <rule>. МетодaddZoneRule()— добавление правила для зоны.HostFirewall— дополнительно:processName(string). МетодapplyRule()выводит[HostFW] Правило: <rule>. МетодallowProcess()— разрешение процесса.CloudFirewall— дополнительно:region(string). МетодapplyRule()выводит[CloudFW] Правило: <rule>. МетодaddGeoRule()— добавление географического правила.
Класс SecurityManager:
- закрытые поля:
managerName,vector<Firewall*> firewalls - методы:
addFirewall(),removeFirewall(),applyRuleToAll(),listFirewalls(),getFirewallInfo()
Вариант 11. Прокси-серверы
Базовый абстрактный класс ProxyServer:
- закрытые поля:
ip(string),port(int),proxyType(string),status(bool) - защищённые поля:
serverName(string),protocol(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
start(),stop(),isRunning(), геттеры - чисто виртуальные методы:
route(const string& request),getConfig(),getProxyTypeName()
Производные классы:
HTTPProxy— дополнительно:cacheSize(int). Методroute()выводит[HTTPProxy] Маршрутизация: <request>. Методforward()— пересылка запроса.SOCKSProxy— дополнительно:socksVersion(int). Методroute()выводит[SOCKS] Туннелирование: <request>. Методtunnel()— создание туннеля.ReverseProxy— дополнительно:targetServers(vector<string>). Методroute()выводит[ReverseProxy] Балансировка: <request>. МетодloadBalance()— распределение нагрузки.
Класс ProxyManager:
- закрытые поля:
managerName,vector<ProxyServer*> proxies - методы:
addProxy(),removeProxy(),routeThroughAll(),listProxies(),getProxyInfo()
Вариант 12. Сетевые камеры
Базовый абстрактный класс NetworkCamera:
- закрытые поля:
ip(string),mac(string),resolution(string),status(bool) - защищённые поля:
cameraName(string),cameraType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
powerOn(),powerOff(),isOnline(), геттеры - чисто виртуальные методы:
capture(const string& mode),getStreamInfo(),getCameraTypeName()
Производные классы:
IPCamera— дополнительно:ptzSupported(bool). Методcapture()выводит[IPCamera] Захват: <mode>. Методrotate()— поворот камеры.WebCamera— дополнительно:fps(int). Методcapture()выводит[WebCam] Захват: <mode>. МетодcaptureFrame()— захват кадра.ThermalCamera— дополнительно:tempRange(string). Методcapture()выводит[Thermal] Захват: <mode>. МетодdetectHeat()— обнаружение тепловых аномалий.
Класс SurveillanceSystem:
- закрытые поля:
systemName,vector<NetworkCamera*> cameras - методы:
addCamera(),removeCamera(),captureAll(),listCameras(),getCameraInfo()
Вариант 13. Балансировщики нагрузки
Базовый абстрактный класс LoadBalancer:
- закрытые поля:
ip(string),algorithm(string),status(bool),backendCount(int) - защищённые поля:
lbName(string),lbType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
enable(),disable(),isEnabled(), геттеры - чисто виртуальные методы:
distribute(const string& request),getStats(),getTypeName()
Производные классы:
RoundRobinLB— дополнительно:currentIndex(int). Методdistribute()выводит[RoundRobin] Распределение: <request>. МетодnextServer()— выбор следующего сервера.LeastConnLB— дополнительно:currentLoad(int). Методdistribute()выводит[LeastConn] Распределение: <request>. МетодselectLeastLoaded()— выбор наименее загруженного.HashLB— дополнительно:hashKey(string). Методdistribute()выводит[Hash] Распределение: <request>. МетодhashSelect()— выбор по хешу.
Класс LBManager:
- закрытые поля:
managerName,vector<LoadBalancer*> balancers - методы:
addBalancer(),removeBalancer(),distributeToAll(),listBalancers(),getBalancerInfo()
Вариант 14. Сетевые хранилища
Базовый абстрактный класс NetworkStorage:
- закрытые поля:
ip(string),protocol(string),totalCapacity(int),status(bool) - защищённые поля:
storageName(string),storageType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
connect(),disconnect(),isConnected(), геттеры - чисто виртуальные методы:
allocate(const string& resource),getUsage(),getStorageTypeName()
Производные классы:
iSCSIStorage— дополнительно:lunCount(int). Методallocate()выводит[iSCSI] Выделение: <resource>. МетодattachLUN()— подключение LUN.NFSShare— дополнительно:exportCount(int). Методallocate()выводит[NFS] Экспорт: <resource>. МетодexportDir()— экспорт каталога.CIFSShare— дополнительно:domain(string). Методallocate()выводит[CIFS] Монтирование: <resource>. МетодmountShare()— монтирование ресурса.
Класс StorageCluster:
- закрытые поля:
clusterName,vector<NetworkStorage*> storages - методы:
addStorage(),removeStorage(),allocateOnAll(),listStorages(),getStorageInfo()
Вариант 15. Контейнеры Docker
Базовый абстрактный класс Container:
- закрытые поля:
name(string),image(string),status(bool),memoryMB(int) - защищённые поля:
containerType(string),runtime(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
start(),stop(),isRunning(), геттеры - чисто виртуальные методы:
run(const string& command),getLogs(),getContainerTypeName()
Производные классы:
WebContainer— дополнительно:exposedPort(int). Методrun()выводит[WebContainer] Выполнение: <command>. Методdeploy()— развёртывание веб-приложения.DBContainer— дополнительно:storagePath(string). Методrun()выводит[DBContainer] Выполнение: <command>. Методmigrate()— выполнение миграции БД.CacheContainer— дополнительно:maxEntries(int). Методrun()выводит[CacheContainer] Выполнение: <command>. Методflush()— очистка кэша.
Класс Orchestrator:
- закрытые поля:
orchestratorName,vector<Container*> containers - методы:
addContainer(),removeContainer(),runOnAll(),listContainers(),getContainerInfo()
Вариант 16. Сетевые сервисы
Базовый абстрактный класс NetworkService:
- закрытые поля:
name(string),port(int),protocol(string),status(bool) - защищённые поля:
serviceName(string),serviceType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
launch(),terminate(),isRunning(), геттеры - чисто виртуальные методы:
serve(const string& request),getMetrics(),getServiceTypeName()
Производные классы:
WebService— дополнительно:baseUrl(string). Методserve()выводит[WebService] Запрос: <request>. МетодhandleRequest()— обработка HTTP-запроса.MailService— дополнительно:mailDomain(string). Методserve()выводит[MailService] Запрос: <request>. МетодprocessEmail()— обработка письма.DNSService— дополнительно:zoneName(string). Методserve()выводит[DNSService] Запрос: <request>. Методresolve()— разрешение DNS-имени.
Класс ServiceRegistry:
- закрытые поля:
registryName,vector<NetworkService*> services - методы:
addService(),removeService(),serveOnAll(),listServices(),getServiceInfo()
Вариант 17. Сетевые адаптеры
Базовый абстрактный класс NetworkAdapter:
- закрытые поля:
name(string),mac(string),speedMbps(int),status(bool) - защищённые поля:
adapterType(string),driver(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
enable(),disable(),isEnabled(), геттеры - чисто виртуальные методы:
transmit(const string& packet),getSignalStrength(),getAdapterTypeName()
Производные классы:
EthernetAdapter— дополнительно:duplexMode(string). Методtransmit()выводит[Ethernet] Передача: <packet>. МетодsetSpeed()— установка скорости.WiFiAdapter— дополнительно:ssid(string),frequency(string). Методtransmit()выводит[WiFi] Передача: <packet>. МетодscanNetworks()— сканирование сетей.CellularAdapter— дополнительно:operatorName(string),signalStrength(int). Методtransmit()выводит[Cellular] Передача: <packet>. МетодconnectOperator()— подключение к оператору.
Класс NetworkManager:
- закрытые поля:
managerName,vector<NetworkAdapter*> adapters - методы:
addAdapter(),removeAdapter(),transmitThroughAll(),listAdapters(),getAdapterInfo()
Вариант 18. Антивирусные шлюзы
Базовый абстрактный класс AVGateway:
- закрытые поля:
ip(string),version(string),status(bool),threatsBlocked(int) - защищённые поля:
gatewayName(string),scanEngine(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
activate(),deactivate(),isActive(), геттеры - чисто виртуальные методы:
scan(const string& target),getReport(),getGatewayTypeName()
Производные классы:
MailGateway— дополнительно:attachmentFilter(bool). Методscan()выводит[MailGW] Сканирование: <target>. МетодscanAttachment()— сканирование вложения.WebGateway— дополнительно:blockedCategories(vector<string>). Методscan()выводит[WebGW] Сканирование: <target>. МетодblockCategory()— блокировка категории сайтов.FileGateway— дополнительно:allowedFormats(vector<string>). Методscan()выводит[FileGW] Сканирование: <target>. МетодscanFile()— сканирование файла.
Класс SecurityCenter:
- закрытые поля:
centerName,vector<AVGateway*> gateways - методы:
addGateway(),removeGateway(),scanOnAll(),listGateways(),getGatewayInfo()
Вариант 19. Серверы видеоконференций
Базовый абстрактный класс ConfServer:
- закрытые поля:
ip(string),maxParticipants(int),status(bool) - защищённые поля:
serverName(string),serverType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
boot(),shutdown(),isOnline(), геттеры - чисто виртуальные методы:
hostSession(const string& sessionId),getSessionInfo(),getServerTypeName()
Производные классы:
VideoServer— дополнительно:resolution(string). МетодhostSession()выводит[VideoServer] Сессия: <sessionId>. МетодstartCall()— начало видеозвонка.AudioServer— дополнительно:codec(string). МетодhostSession()выводит[AudioServer] Сессия: <sessionId>. МетодstartAudio()— начало аудиосессии.ScreenShareServer— дополнительно:captureFps(int). МетодhostSession()выводит[ScreenShare] Сессия: <sessionId>. МетодstartShare()— начало демонстрации экрана.
Класс ConferenceManager:
- закрытые поля:
managerName,vector<ConfServer*> servers - методы:
addServer(),removeServer(),hostOnAll(),listServers(),getServerInfo()
Вариант 20. Системы мониторинга
Базовый абстрактный класс MonitorNode:
- закрытые поля:
ip(string),nodeType(string),pollInterval(int),status(bool) - защищённые поля:
nodeName(string),metricType(string) - открытые методы: конструктор с параметрами, виртуальный деструктор,
startMonitoring(),stopMonitoring(),isMonitoring(), геттеры - чисто виртуальные методы:
poll(const string& metric),getAlerts(),getNodeTypeName()
Производные классы:
CPUMonitor— дополнительно:thresholdPercent(int). Методpoll()выводит[CPU] Опрос: <metric>. МетодcheckLoad()— проверка нагрузки ЦП.MemoryMonitor— дополнительно:limitMB(int). Методpoll()выводит[Memory] Опрос: <metric>. МетодcheckUsage()— проверка использования памяти.DiskMonitor— дополнительно:thresholdPercent(int). Методpoll()выводит[Disk] Опрос: <metric>. МетодcheckSpace()— проверка свободного места.
Класс MonitoringCenter:
- закрытые поля:
centerName,vector<MonitorNode*> nodes - методы:
addNode(),removeNode(),pollAll(),listNodes(),getNodeInfo()
Порядок выполнения
- Создать проект C++ в Qt Creator (CMake).
- Определить абстрактный базовый класс
NetworkClientс указанными полями и методами. - Реализовать производные классы
TcpClient,UdpClient,WebSocketClient, переопределив чисто виртуальные методы. - Реализовать класс
Serverс управлением списком клиентов через указатели на базовый класс. - В
main()создать объекты и продемонстрировать все сценарии взаимодействия. - Скомпилировать, запустить, сохранить скриншоты.
Контрольные вопросы
- Какие модификаторы доступа существуют в C++? Чем отличается
privateотprotected? - Что такое абстрактный класс и чисто виртуальная функция?
- Почему деструктор базового класса следует объявлять виртуальным?
- Чем отличается композиция от наследования? В каких случаях предпочтительнее каждое из них?
- Что такое порядок вызова конструкторов и деструкторов при создании объекта производного класса?
- Как в производном классе вызвать конструктор базового класса с параметрами?
- Почему класс
Serverхранит указателиNetworkClient*а не объектыNetworkClient? - Какие преимущества даёт использование наследования при моделировании сетевых клиентов?
Содержание отчёта
- Тема, цель и задание лабораторной работы.
- Диаграмма классов (можно нарисовать от руки или в инструменте).
- Текст программы с комментариями.
- Скриншоты результата выполнения программы.
- Ответы на контрольные вопросы.