moevm / oop

Object-oriented programming course
30 stars 225 forks source link

[8303]Kurlin_Nikita_L5 #629

Open Yogik10 opened 4 years ago

Yogik10 commented 4 years ago

Смотреть классы SaveGameHandler, LoadGameHandler, SaveGameCommand, LoadGameCommand, FieldSnapshot, File, FileIn.

anyfilatov commented 4 years ago

У вас тут какая-то беда с RAII. идея в том, чтобы файл захватывался в конструкторе, а отпускался в деструкторе. (Лучше, чтобы это было в классе логов, а не классе поля) У вас же файл захватывается в определённом методе. И кстати file->~File(); - это плохая идея. Кажется, что delete сделан именно для этого. Ну или у класса File можно метод запилить отдельный, который отпускает файл, если это очень надо

  1. доделать пункт 3
Yogik10 commented 4 years ago

Здравствуйте. Правильно я понимаю, что класс файла сам должен знать имя открываемого на запись или чтение файла? То есть для файла логов будет создан класс, LogFile, у которого в конструктор не передаются никакие параметры, а сам конструктор открывает на запись файл с известным ему именем?

anyfilatov commented 4 years ago

Нет, логика такая. Сейчас у вас есть File - это синглтон над ofsream. Этот файл создаётся внутри FieldSnapshot::save(). А должен создаваться, например, в конструкторе FieldSnapshot. Или какого-то класса повыше уровнем. Про класс LogFile я напсал для примера. Сама идея RAII только в том, чтобы вы ofstream.open писали в конструкторе чего-нибудь, а ofstream.close - в деструкторе. Причём именно тех классов, кто реально пользуется ресурсом. Можно было бы вообще этот файл отдаль Field-у. Но тогда будет плохо, что в один файл может писать только одно поле. Надо организовать так, чтобы у вас могло быть несколько полей, сохранятелей, чтобы всё вместе работало, но файл не жил всё время жизни программы