Повторение: String Wrapper
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 16 из 61.
Задание
ЛегкоДавайте создадим модуль StringObject, который оборачивает динамически выделенный массив символов. Эта задача на повторение объединяет полный жизненный цикл объекта — конструктор, метод только для чтения и деструктор — работающие вместе для безопасного управления памятью.
Вы создадите три файла:
stringobj.h: Объявите структуруStringObjectс одним членом:char *text(указатель на динамически выделенную строку). Также объявите три функции:create_string— принимаетconst char *в качестве входных данных и возвращает указатель на вновь выделенный StringObjectprint_string— принимаетconst StringObject *и отображает сохраненный текстfree_string— принимаетStringObject *и освобождает всю выделенную память
STRINGOBJ_H.stringobj.c: Реализуйте все три функции. Ваш конструктор должен выделить память для структуры, затем выделить память для текста (помните проstrlenплюс один для нулевого терминатора) и скопировать входную строку. Ваш деструктор должен освобождать память в обратном порядке — сначала внутренний буферtext, затем саму структуру. Включите проверку на NULL в деструктор для безопасности.main.c: Используйте ваш модуль для создания строкового объекта, отображения его содержимого, а затем правильной очистки.
Вы получите одни входные данные: текстовую строку для хранения в вашем StringObject.
В вашем основном файле создайте StringObject с предоставленным текстом, выведите его содержимое, освободите память, а затем выведите подтверждающее сообщение.
Функция print_string должна выводить данные в следующем формате:
Text: {text}После освобождения памяти выведите:
FreedНапример, при вводе Hello World вывод будет следующим:
Text: Hello World
FreedПопробуйте сами
#include <stdio.h>
#include "stringobj.h"
int main() {
char input[256];
fgets(input, sizeof(input), stdin);
// Удалить символ новой строки, если он есть
int len = 0;
while (input[len] != '\0') len++;
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
// TODO: Создать StringObject с введенным текстом
// TODO: Вывести строку, используя print_string
// TODO: Освободить StringObject, используя free_string
// TODO: Вывести "Freed" для подтверждения очистки
return 0;
}
Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга