Это дополнительный вопрос к моему предыдущему вопросу:
Инициализируйте const члены, используя сложную функцию в классе C ++
Короче говоря, у меня есть программа, которая имеет класс Grid, который содержит свойства 3D-сетки. Я хотел бы, чтобы свойства этой сетки были доступны только для чтения после создания, чтобы сложные функции внутри класса не могли случайно испортить сетку (например, if (bla = 10) вместо if (bla == 10)) и т. Д. Теперь на этот вопрос был дан хороший ответ в предыдущем обсуждении: вызов списков инициализаторов с помощью функции create.
Вот и моя новая проблема. Моя сетка имеет много свойств, которые просто описывают сетку (количество точек сетки, координаты в точках сетки и т. Д.), Для которых просто не имеет смысла перераспределять их между различными объектами. Тем не менее, базовые учебники на C ++ всегда связывают функции с большим количеством параметров с плохим дизайном, но они мне нужны, чтобы иметь возможность иметь постоянные переменные-члены.
Существуют ли стандартные методики для решения таких проблем?
Ответ зависит от того, что вы пытаетесь защитить.
Если вы пытаетесь уверить это пользователи класса не может случайно изменить критические параметры, тогда способ сделать это состоит в том, чтобы объявить эти члены как private
или же protected
и только обеспечить const
получатели, если они вообще нужны вне реализации класса.
Если вы пытаетесь заверить, что исполнитель из Grid
класс не изменяет эти значения, тогда есть несколько способов сделать это. Одним простым способом является создание подкласса, который содержит только эти параметры, а затем ответ выглядит как 1. Другой способ — объявить их const
в этом случае они должны быть инициализированы, когда Grid
экземпляр построен.
Если ответ 2, то есть и другие способы предотвращения непреднамеренного изменения критических значений. Пока вы пишете и тестируете реализацию класса, вы можете временно использовать фиксированную пустышку const
значения для критических параметров, гарантируя, что другие функции, которые вы пишете, не могут изменить эти значения.
Еще один трюк, чтобы избежать именно if (i=7) ...
ошибка, когда вы хотели написать if (i == 7) ...
всегда ставить константу на первое место. То есть пиши if (7 == i) ...
, Кроме того, любой достойный компилятор должен иметь возможность пометить предупреждение для такого рода ошибок — убедитесь, что вы используете эту функцию, включив все предупреждения и отчеты об ошибках, которые предоставляет ваш компилятор.