Повторение: String Wrapper
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 16 из 61.
Задание
ЛегкоДавайте создадим модуль StringObject, который оборачивает динамически выделенный массив символов. Эта итоговая задача объединяет полный жизненный цикл объекта, конструктор, метод только для чтения и деструктор, которые вместе обеспечивают безопасное управление memory.
Вам нужно создать три файла:
stringobj.h: объявите структуруStringObjectс единственным member:char *text(указатель на динамически выделенную строку). Также объявите три function:create_string: принимает значениеconst char *и возвращает указатель на newly allocated StringObjectprint_string: принимает значениеconst StringObject *и отображает сохранённый текстfree_string: принимает значениеStringObject *и освобождает всю выделенную memory
STRINGOBJ_H.stringobj.c: Implement все три function. Ваш конструктор должен выделить memory для структуры, затем выделить memory для текста (помните оstrlenплюс единице для null-терминатора) и скопировать входную строку. Деструктор должен освобождать memory в обратном порядке: сначала внутренний буферtext, затем саму структуру. Для safety добавьте проверку NULL в деструктор.main.c: используйте свой модуль, чтобы создать объект строки, отобразить его содержимое, а затем корректно выполнить очистку.
На вход будет получено одно значение: текстовая string, которую нужно сохранить в вашем StringObject.
В основном файле создайте StringObject с предоставленным текстом, выведите его содержимое, освободите memory, а затем выведите сообщение подтверждения.
Функция 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: Create a StringObject with the input text
// TODO: Вывести строку с помощью print_string
// TODO: Free the StringObject using free_string
// TODO: Вывести "Freed" для подтверждения очистки
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C